斜对称矩阵与另一个矩阵的乘积

Product Of Skew-Symmetric Matrix And Another Matrix

我在 numpy 中有一组 n 个点(比如 p),形状为 (3,),还有一个形状为 (3,3) 的矩阵 (B)。 我需要执行 p 和 B 的斜对称形式的乘积。 我试图做 p 和 B 的叉积,因为一些在线资源建议向量(p)与另一个矩阵(B)的斜对称形式的乘积等于向量(p)与矩阵(B)的叉积. 我试过这个:

p = np.array([2, 7, 4])
B = np.arange(9).reshape([3,3])
output = np.cross(p, B)

结果:

[[ 10  -4   2]
 [ 19   2 -13]
 [ 28   8 -28]]

但是,当我尝试针对多个点(以下 10 个)一起执行此操作时,出现错误:

ps = np.arange(30).reshape([10,3])
B = np.arange(9).reshape([3,3])
output = np.cross(ps, B)

结果:

> Traceback (most recent call last):   File "example.py", line 9, in
> <module>
>     output = np.cross(ps, B)   File "<__array_function__ internals>", line 6, in cross   File
> "/usr/local/lib/python3.7/dist-packages/numpy/core/numeric.py", line
> 1583, in cross
>     shape = broadcast(a[..., 0], b[..., 0]).shape ValueError: shape mismatch: objects cannot be broadcast to a single shape

你们能指出我做错了什么吗?谢谢!

使用 (10,3) 和 (3,3) 数组:

In [621]: np.cross(ps,B)
Traceback (most recent call last):
  File "<ipython-input-621-202aa85dbcf4>", line 1, in <module>
    np.cross(ps,B)
  File "<__array_function__ internals>", line 5, in cross
  File "/usr/local/lib/python3.8/dist-packages/numpy/core/numeric.py", line 1616, in cross
    shape = broadcast(a[..., 0], b[..., 0]).shape
ValueError: shape mismatch: objects cannot be broadcast to a single shape

将维度调整为 (10,1,3) 可以生成:

In [622]: np.cross(ps[:,None,:],B).shape
Out[622]: (10, 3, 3)

实际上,它在主要维度上做着类似 outer 的产品。 cross 部分位于尾随尺寸 3 维度上。

但您可能想要确定建议使用此方法的来源。两个向量之间的叉积是另一个垂直于它们的向量(在 3d space 中)。 [622] 是每个 ps 向量集与每个 B 向量集的叉积。我看不到此操作有意义的上下文。


根据 skew-symmetric matrix wiki 文章工作。

如果我定义两个一维数组:

In [1]: a = np.array([1,2,3]); b = np.array([2,4,3])

他们的 cross 产品是:

In [2]: np.cross(a,b)
Out[2]: array([-6,  3,  0])

定义一个函数来生成偏斜对称矩阵:

In [3]: def mk_skew(a):
   ...:     return np.array([[0,-a[2],a[1]],[a[2],0,-a[0]],[-a[1],a[0],0]])
   ...: 
In [4]: A = mk_skew(a)
In [5]: A
Out[5]: 
array([[ 0, -3,  2],
       [ 3,  0, -1],
       [-2,  1,  0]])
In [6]: B = mk_skew(b)

匹配的产品是:

In [10]: A@b
Out[10]: array([-6,  3,  0])
In [11]: a@B
Out[11]: array([-6,  3,  0])

所以我可以把'points',p的集合想象成一个数组(n,3)。但是我不确定在这种情况下您的 B (3,3) 矩阵应该是什么?它不是斜对称的,也不是 3 'points'.

的集合