23

我试图找到某种方法从 Matlab 中的 3*(一个大数字)矩阵的每一列中减去一个大小为 3 的向量。当然我可以使用循环,但我试图找到一些更有效的解决方案,有点像 numpy 广播。哦,我不能使用 repmat 因为我没有足够的内存来使用它(因为它创建了另一个 3*(一个大数字)矩阵)......

这可能吗?

4

4 回答 4

18

由于即时加速 (JITA)等编译器优化,MATLAB 中的循环不再糟糕。等等。大多数时候,我注意到在当前 MATLAB 版本中使用循环的解决方案比复杂的(尽管很酷:D)单行代码要快得多

bsxfun可能会奏效,根据我的经验,它也往往存在内存问题,但比repmat.

所以语法是:

AA = bsxfun(@minus,A,b)b向量在哪里,A你的大矩阵在哪里

但我敦促您分析循环版本,然后再决定!很可能,由于内存限制,您可能别无选择:)

于 2010-07-09T13:51:36.057 回答
18

其他答案有点过时了——Matlab R2016b 似乎已将广播添加为标准功能。该博客文章中与问题匹配的示例:

>> A = ones(2) + [1 5]'
A =
     2     2
     6     6
于 2016-10-18T09:44:40.763 回答
4

我不知道这是否会加快代码速度,但是从向量中减去标量不会出现内存问题。由于您的矩阵大小是如此不对称,因此短维度上的 for 循环的开销可以忽略不计。

所以也许

matout = matin;
for j = 1:size(matin, 1) %3 in this case
     matout(j,:) = matin(j,:) - vec_to_subtract(j);
end

当然,您可以就地执行此操作,但我不知道您是否想保留原始矩阵。

于 2010-07-12T17:16:05.173 回答
0

实际上,似乎http://www.frontiernet.net/~dmschwarz/genops.html(操作员重载 mex 文件)也可以解决问题,即使我还没有测试过。

于 2010-07-19T13:24:58.547 回答