Matlab中的Numpy广播等效?
我想在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
是你的大矩阵。
但我建议你先测试一下使用循环的版本,然后再做决定!很可能因为内存限制,你可能没有其他选择 :)