我试图找到某种方法从 Matlab 中的 3*(一个大数字)矩阵的每一列中减去一个大小为 3 的向量。当然我可以使用循环,但我试图找到一些更有效的解决方案,有点像 numpy 广播。哦,我不能使用 repmat 因为我没有足够的内存来使用它(因为它创建了另一个 3*(一个大数字)矩阵)......
这可能吗?
我试图找到某种方法从 Matlab 中的 3*(一个大数字)矩阵的每一列中减去一个大小为 3 的向量。当然我可以使用循环,但我试图找到一些更有效的解决方案,有点像 numpy 广播。哦,我不能使用 repmat 因为我没有足够的内存来使用它(因为它创建了另一个 3*(一个大数字)矩阵)......
这可能吗?
由于即时加速 (JITA)等编译器优化,MATLAB 中的循环不再糟糕。等等。大多数时候,我注意到在当前 MATLAB 版本中使用循环的解决方案比复杂的(尽管很酷:D)单行代码要快得多。
bsxfun
可能会奏效,但根据我的经验,它也往往存在内存问题,但比repmat
.
所以语法是:
AA = bsxfun(@minus,A,b)
b
向量在哪里,A
你的大矩阵在哪里
但我敦促您分析循环版本,然后再决定!很可能,由于内存限制,您可能别无选择:)
其他答案有点过时了——Matlab R2016b 似乎已将广播添加为标准功能。该博客文章中与问题匹配的示例:
>> A = ones(2) + [1 5]'
A =
2 2
6 6
我不知道这是否会加快代码速度,但是从向量中减去标量不会出现内存问题。由于您的矩阵大小是如此不对称,因此短维度上的 for 循环的开销可以忽略不计。
所以也许
matout = matin;
for j = 1:size(matin, 1) %3 in this case
matout(j,:) = matin(j,:) - vec_to_subtract(j);
end
当然,您可以就地执行此操作,但我不知道您是否想保留原始矩阵。
实际上,似乎http://www.frontiernet.net/~dmschwarz/genops.html(操作员重载 mex 文件)也可以解决问题,即使我还没有测试过。