Matlab中的Numpy广播等效?

24 投票
4 回答
14227 浏览
提问于 2025-04-16 01:03

我想在Matlab中找到一种方法,把一个大小为3的向量从一个3乘以一个大数字的矩阵的每一列中减去。当然,我可以用循环来实现,但我想找一个更高效的解决方案,类似于numpy中的广播功能。哦,还有,我不能使用repmat,因为我没有足够的内存来使用它(因为它会创建另一个3乘以一个大数字的矩阵)……

这可能吗?

4 个回答

4

我不确定这样做是否会让代码更快,但从一个向量中减去一个数(标量)是不会有内存问题的。因为你的矩阵大小不对称,所以在短的一边用循环的额外开销几乎可以忽略不计。

所以也许可以这样做:

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

当然,你可以直接在原地进行操作,但我不知道你是否想保留原来的矩阵。

19

其他的回答有点过时了——Matlab R2016b 似乎已经把广播功能作为标准特性加入了。这里有一个来自那个博客的例子,正好和这个问题相关:

>> A = ones(2) + [1 5]'
A =
     2     2
     6     6
18

在MATLAB中,循环现在并不算糟糕,这要归功于一些编译器优化技术,比如即时加速(JITA)等。我发现,现如今的MATLAB版本中,使用循环的解决方案通常比那些复杂的(虽然看起来很酷 :D)一行代码要快得多。

bsxfun可能会解决问题根据我的经验,它也会出现内存问题,不过比repmat要好一些。

所以,语法是这样的:

AA = bsxfun(@minus,A,b),其中b是一个向量,A是你的大矩阵。

但我建议你先测试一下使用循环的版本,然后再做决定!很可能因为内存限制,你可能没有其他选择 :)

撰写回答