这是一个简单的外部产品。不需要 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
看到 kron 确实有效,尽管我敢打赌在这里使用 kron 的效率可能低于简单的外积乘法。
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
最糟糕的选择是repmat。同样,由于它首先人为地复制内存中的向量,因此在大向量的情况下,它必须出去并抢占大块内存。
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
您需要了解的正是为什么这些工具都可以用于这项工作,以及它们为什么不同。