Python Matlab等效于Numpy广播?

Python Matlab等效于Numpy广播?,python,matlab,numpy,array-broadcasting,Python,Matlab,Numpy,Array Broadcasting,我试图找到一种方法,在Matlab中从3*(一个大数字)矩阵的每列中减去一个大小为3的向量。当然我可以使用循环,但我正试图找到一些更有效的解决方案,有点像numpy广播。哦,我不能使用repmat,因为我没有足够的内存来使用它(因为它会创建另一个3*(一个大数字)矩阵) 这是可能的吗?由于编译器的优化,循环在MATLAB中不再糟糕。大多数时候,我注意到在当前的MATLAB版本中使用循环的解决方案比复杂的(尽管很酷:D)一行程序要快得多 可能会起作用,但根据我的经验,它也会有内存问题,但不如rep

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


这是可能的吗?

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

可能会起作用,但根据我的经验,它也会有内存问题,但不如
repmat

所以语法应该是:

AA=bsxfun(@减号,A,b)
其中
b
是向量,
A
是你的大矩阵


但我敦促你先分析一下这个不合理的版本,然后再做决定!最可能的情况是,由于内存限制,您可能没有选择:)

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

所以也许

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

当然,您可以在适当的位置执行此操作,但我不知道您是否希望保留原始矩阵。

事实上,似乎(使用mex文件重载运算符)也能实现此目的,尽管我尚未对其进行测试。

其他答案有点过时——Matlab R2016b似乎已经过时了。该博客文章中与问题匹配的示例:

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

关于BSXFUN,您可能是对的。它仍然会有内存问题,但我相信它通常比使用REPMAT要好一些。我喜欢
bsxfun
的一点是,在2010a和2010b版本中,它将以本机方式多线程处理您的代码,以提高性能,而无需您过多干预。@JudoWill:太好了!我一直在寻找一个针对repmat的明确案例——你有关于它的文档吗?也许这个链接:,如你所见,多线程只适用于足够大的矩阵。正如最近的一个答案所指出的,Matlab R2016b似乎已经将广播作为一个标准功能添加。()实际上,for循环是在大维度上的(因为我从size-3*(很多)数组的每一列中减去一个size-3向量),所以我害怕for循环。这样考虑一下——将数组分成3个大小为1xN的向量。然后从每个向量中减去相应的标量。所以for循环是短维的。2016b中还有其他一些惊人的新特性,比如可以用“+”连接的一流字符串()。哦,我只是在讽刺:-)注:广播很棒,但有时你得不到你想要的。我花了4个小时在我的代码中查找这个错误:
x=(1-A+K*C)^-1;%A是一个nxn矩阵
。MATLAB不知道我想要的是单位矩阵!(为了他人的利益而共享)。正如最近的一个答案所指出的,MatlabR2016B似乎已将广播添加为标准功能。()