我遇到了一个我无法通过矢量化实现的操作。
假设我想找到由
定义的应用程序矩阵h:X - >交叉(V,X)
其中V是预定矢量(X和V都是3乘1矢量)。
在Matlab中,我会做类似
的事情M= cross(repmat(V,1,3),eye(3,3))
得到这个矩阵。例如,V = [1; 2; 3]产生
M =
0 -3 2
3 0 -1
-2 1 0
现在假设我有一个3乘N矩阵
V=[V_1,V_2...V_N]
每列定义自己的跨产品操作。对于N = 2,这是一个天真的尝试找到V列定义的两个交叉乘积矩阵
V=[1,2,3;4,5,6]'
M=cross(repmat(V,1,3),repmat(eye(3,3),1,2))
结果
V =
1 4
2 5
3 6
M =
0 -6 2 0 -3 5
3 0 -1 6 0 -4
-2 4 0 -5 1 0
虽然我在期待
M =
0 -3 2 0 -6 5
3 0 -1 6 0 -4
-2 1 0 -5 4 0
反转2列。
有没有办法在没有for循环的情况下实现这个目标?
谢谢!
答案 0 :(得分:1)
首先,在处理矩阵时,请务必仔细阅读cross
的文档:
它说:
C = cross(A,B,DIM), where A and B are N-D arrays, returns the cross
product of vectors in the dimension DIM of A and B. A and B must
have the same size, and both SIZE(A,DIM) and SIZE(B,DIM) must be 3.
请记住,如果您没有指定DIM
,则会自动将其假定为1,因此您需要按照列进行操作。在第一种情况下,您将输入A
和B
都指定为3 x 3矩阵。因此,由于假设DIM=1
,输出将是每个列的叉积。因此,您希望输出的第i列包含A
的第i列和B
的第i列的叉积和行数预计为3,列数需要在A
和B
之间匹配。
您获得了预期的结果,因为第一个输入A
已经[1;2;3]
在列上正确复制了三次。从您的第二段代码开始,V
作为第一个输入(A
)的期望如下:
V =
1 1 1 4 4 4
2 2 2 5 5 5
3 3 3 6 6 6
但是,当您执行repmat
时,您实际上在每列之间交替。事实上,你得到了这个:
V =
1 4 1 4 1 4
2 5 2 5 2 5
3 6 3 6 3 6
repmat
将矩阵拼贴在一起,并指定您想要将V
水平平铺三次。这显然不正确。这解释了为什么交换列的原因,因为V
的第二,第四和第六列实际上应该出现在最后三列。因此,输入列的排序是输出显示为交换的原因。
因此,您需要重新排序V
,以便前三个向量为[1;2;3]
,然后接下来的三个向量为[4;5;6]
。因此,您可以先生成原始V
矩阵,然后创建一个新矩阵,使得奇数列首先出现在一组三个中,然后是三个一组中的偶数列:
>> V = [1,2,3;4,5,6].';
>> V = V(:, [1 1 1 2 2 2])
V =
1 1 1 4 4 4
2 2 2 5 5 5
3 3 3 6 6 6
现在将V
与cross
一起使用并保持相同的第二个输入:
>> M = cross(V, repmat(eye(3), 1, 2))
M =
0 -3 2 0 -6 5
3 0 -1 6 0 -4
-2 1 0 -5 4 0
对我好看!