我是matlab的新手,只是想知道你们是否可以帮我解决这个问题。
例如,我有两个矩阵:
A = [X1 X2 X3 X4]
B = [Y1; Y2; Y3]
现在我真正想要实现的是以这种方式将这两个矩阵相乘:
[X1Y1 X2Y1 X3Y1 X4Y1;
X1Y2 X2Y2 X3Y2 X4Y2;
X1Y3 X2Y3 X3Y3 X4Y3;
.... and so on]
我尝试使用A(1,:).*B(:,1)
,但matlab表示矩阵维度必须一致。
我只是不知道如何在matlab上操作它,但在excel中是可能的。
答案 0 :(得分:3)
这是一个简单的外部产品。 kron是不需要的(虽然它会起作用。)bsxfun是一种疯狂的矫枉过正,虽然会产生你所要求的。 repmat是不合适的,因为虽然它可以帮助你做你想做的事情,但它会使用比所需更多的资源在内存中复制数组。 (如果有好的编程风格,请立即使用低效的编程风格。)
您需要使用的只是简单的*运算符。
A是行向量。 B列向量。
C = B*A
将产生结果C(i,j)= B(i)* A(j),这正是您正在寻找的。请注意,这是有效的,因为B是3x1而A是1x4,所以"内部" B和A的尺寸确实符合。
在MATLAB中,如果你不确定某些东西是否有效,那就试试吧!
A = [1 2 3 4];
B = [1;2;3];
C = B*A
ans =
1 2 3 4
2 4 6 8
3 6 9 12
看到克朗确实有效,尽管我打赌在这里使用克朗的效率可能比简单的外部产品倍增效率低。
C = kron(B,A)
C =
1 2 3 4
2 4 6 8
3 6 9 12
同样,bsxfun也会在这里工作,虽然因为我们使用一般工具来做一些基本操作员会做的事情,所以我打赌它效率稍差。
C = bsxfun(@times,B,A)
C =
1 2 3 4
2 4 6 8
3 6 9 12
最糟糕的选择是重新制作。同样,由于人工复制内存FIRST中的向量,它必须在大型向量的情况下出去并获取大块内存。
C = repmat(B,1,4).*repmat(A,3,1)
C =
1 2 3 4
2 4 6 8
3 6 9 12
我认为为了完整性,你也可以使用meshgrid或ndgrid。看到它正在完成repmat所做的事情,但在这里它明确地创建了新的矩阵。同样,如果有很好的工具可以完全按照您的意愿进行,那么这是一种糟糕的编程风格。
[BB,AA] = ndgrid(B,A)
BB =
1 1 1 1
2 2 2 2
3 3 3 3
AA =
1 2 3 4
1 2 3 4
1 2 3 4
C = BB.*AA
C =
1 2 3 4
2 4 6 8
3 6 9 12
您需要了解的是为什么每个工具都可以用于工作,以及它们为什么不同。
答案 1 :(得分:1)
在Matlab中有*
和.*
,它们非常不同。
*
是正常的矩阵乘法,这就是你想要的B*A
,注意B
必须先到,因为内部维度必须匹配。您可以将一列乘以一列而不是一列乘以一列(除非它们具有相同数量的元素)。
.*
是逐个元素的乘法,在这种情况下,矩阵的大小和形状必须完全相同,例如[1 2 3]。* [4 5 6] = [1 * 4 2 * 5 3 * 6] = [4 10 18]
答案 2 :(得分:0)
不要做“.*
”。你应该做一个“*
”。
“.*
”用于索引乘法索引,如果它们的向量大小相等,则应该给出[X1Y1 X2Y2 X3Y3]。
如果你进行常规乘法“*
”,这实际上就是矩阵乘法。
答案 3 :(得分:-1)
我认为你只需转置其中一个向量。您将列向量(A(1,:))与行向量(B(:,1))相乘。这应该有效:
C = A(1,:).*B(:,1)';