爱因斯坦求和 torch

目录

向量点积

矩阵乘法

矩阵转置

向量转换相机坐标系



在 Python 的科学计算库(如 NumPy)中,einsum 是一个强大的函数,它可以简洁地表示各种张量运算。下面是几个不同类型的使用示例:


向量点积


向量点积是两个向量对应元素相乘后求和的结果。使用 einsum 可以非常简洁地实现。
 

import numpy as np

# 创建两个向量
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# 使用 einsum 计算向量点积
dot_product = np.einsum('i,i->', a, b)
print("向量点积结果:", dot_product)

矩阵乘法


矩阵乘法是将一个矩阵的行与另一个矩阵的列进行点积运算。
 

import numpy as np

# 创建两个矩阵
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

# 使用 einsum 计算矩阵乘法
matrix_product = np.einsum('ij,jk->ik', A, B)
print("矩阵乘法结果:\n", matrix_product)


矩阵转置


矩阵转置是将矩阵的行和列进行交换。
 

import numpy as np

# 创建一个矩阵
M = np.array([[1, 2, 3], [4, 5, 6]])

# 使用 einsum 进行矩阵转置
transposed_matrix = np.einsum('ij->ji', M)
print("矩阵转置结果:\n", transposed_matrix)


这些示例展示了 einsum 在不同张量运算中的应用。它的优势在于能够用简洁的字符串表示复杂的运算,避免了使用显式的循环来实现这些运算,提高了代码的可读性和执行效率。

向量转换相机坐标系

torch.einsum('c,bCc->bC', world_up_vector, extrinsic_matrix[..., :3, :3])

等效代码:

new_world_up = torch.matmul(world_up_vector.unsqueeze(0), extrinsic_matrix[..., :3, :3])  # 形状 (B, 1, 3)
new_world_up = new_world_up.squeeze(1)  # 形状 (B, 3)