我有 2 个矩阵 A (nxm) 和 B (nxd),想要将 A 的每一列逐元素与 B 的行相乘。有 m A 中的列和 B 中的 n 个 1xd 向量,因此结果是 m nxd 矩阵。然后我想对 sum(result_i, 1) 进行求和以获得 m 1xd 向量,我想应用 vertcat 来获得 mxd 矩阵。我正在使用 for 循环执行此操作,但速度很慢,因为 n 和 d 很大。我怎样才能在matlab中对其进行矢量化以使其更快?谢谢。
编辑:
你说得对:我对自己的问题感到困惑。我所说的“将 A 的每一列与 B 的一行相乘按元素”的意思是将 A 列的 n 个元素与 B 的相应 n 行相乘。我想要做什么A 的一列如下(我对 A 的 m 列重复此操作,然后将 C 的向量垂直聚合在一起以获得 mxd 矩阵):
column_of_A =
3
3
1
B =
3 1 3 3
2 2 1 2
1 3 3 3
C = sum(diag(column_of_A)*B, 1)
16 12 15 18
最佳答案
您可以通过以下方式矢量化您的操作。但请注意,矢量化的代价是更高的内存使用量,因此该解决方案最终可能不适合您。
%# multiply nxm A with nx1xd B to create a nxmxd array
tmp = bsxfun(@times,A,permute(B,[1 3 2]));
%# sum and turn into mxd
out = squeeze(sum(tmp,1));
您可能希望在一行中完成所有操作,这可能有助于 Matlab JIT 编译器节省内存。
编辑
如果您没有 bsxfun
,这里有一种替换第一行的方法
[n,m] = size(A);
[n,d] = size(B);
tmp = repmat(A,[1 1 d]) .* repmat(permute(B,[1 3 2]),[1,m,1]);
关于arrays - 如何在matlab中向量化这个矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5580219/