Matlab相当于Numpy广播?

时间:2010-07-09 13:49:15

标签: python matlab numpy numpy-broadcasting

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

这可能吗?

4 个答案:

答案 0 :(得分:18)

由于just-in-time acceleration (JITA)之类的编译器优化,MATLAB中的循环已经不错了。大多数时候,我注意到当前MATLAB版本中的循环解决方案比复杂的(虽然很酷:D)单行更快

根据我的经验,

bsxfun可能会诀窍,它往往会出现内存问题,但不如repmat

所以语法是:

AA = bsxfun(@minus,A,b)其中b是向量,A是您的大矩阵

但我恳请你介绍一下loopy版本,然后决定!最有可能的是,由于内存限制,您可能无法选择:)

答案 1 :(得分:13)

其他答案有点过时--Matlab R2016b似乎有added broadcasting as a standard feature。该博客文章中的一个例子与问题相符:

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

答案 2 :(得分:4)

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

所以也许

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

当然,你可以这样做,但我不知道你是否想要保留原始矩阵。

答案 3 :(得分:0)

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