我正在尝试在Matlab中将一个大小为3的向量从一个3*(一个很大的数字)矩阵的每一列中减去。当然,我可以使用循环,但我正在尝试寻找一些更有效的解决方案,有点像numpy广播。哦,我不能使用repmat,因为我没有足够的内存来使用它(因为它会创建另一个3*(一个很大的数字)的矩阵)...
这是否可能?
我正在尝试在Matlab中将一个大小为3的向量从一个3*(一个很大的数字)矩阵的每一列中减去。当然,我可以使用循环,但我正在尝试寻找一些更有效的解决方案,有点像numpy广播。哦,我不能使用repmat,因为我没有足够的内存来使用它(因为它会创建另一个3*(一个很大的数字)的矩阵)...
这是否可能?
其他答案有些过时了——Matlab R2016b似乎已经成为标准功能添加了广播。该博客文章中与问题匹配的示例:
>> A = ones(2) + [1 5]'
A =
2 2
6 6
x=(1-A+K*C)^-1; % A是一个nxn矩阵
。MATLAB不知道我想要单位矩阵!(分享给其他人的利益)。 - Billbsxfun
可能会有所帮助但是根据我的经验,它也可能存在内存问题,但比repmat
少。
因此,语法将是:
AA = bsxfun(@minus,A,b)
其中b
是向量,A
是您的大矩阵
但我建议您对循环版本进行分析,然后再决定!由于内存限制,您可能没有选择 :)
bsxfun
的原因是在2010a和2010b版本中,它可以本地多线程运行您的代码,从而提高性能,而且不需要太多干预。 - JudoWillrepmat
的明确案例——你有相关文档吗? - Jacob我不确定这样做是否会加快代码运行速度,但从向量中减去标量不会出现内存问题。由于您的矩阵大小非常不对称,在短维上使用for循环的开销可以忽略不计。
因此也许
matout = matin;
for j = 1:size(matin, 1) %3 in this case
matout(j,:) = matin(j,:) - vec_to_subtract(j);
end
当然,您可以直接在原地进行操作,但我不知道您是否想保留原始矩阵。