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

这是可能的吗?

有帮助吗?

解决方案

由于刚刚在matlab中不再是matlab在matlab中不再糟糕-in-time加速(jita)。大部分时间,我注意到当前MATLAB版本中有循环的解决方案是超越复杂(尽管,酷:d)单衬里。

bsxfun 可能会做这个技巧但是,在我的经验中,它往往具有内存问题,而且比世代odicetagcode少。

所以语法是:

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

但我敦促您配置循环版本,然后决定!最可能是由于内存约束,您可能没有选择:)

其他提示

其他答案有点超出日期 - matlab r2016b似乎有以标准功能添加广播。来自该博客文章的示例与问题匹配:

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

我不知道这是否会加快代码,但从向量中减去标量并没有内存问题。由于您的矩阵尺寸是不对称的,因此短尺寸上的用于循环的开销可以忽略不计。

所以也许

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文件重载的操作员)也是技巧,即使我还没有测试它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top