【问题标题】:Matlab equivalent of Numpy broadcasting?Matlab相当于Numpy广播?
【发布时间】:2011-03-13 21:29:49
【问题描述】:

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

这可能吗?

【问题讨论】:

标签: python matlab numpy array-broadcasting


【解决方案1】:

由于 just-in-time acceleration (JITA) 等编译器优化,MATLAB 中的循环不再糟糕。大多数时候,我注意到在当前 MATLAB 版本中使用循环的解决方案比复杂的(尽管很酷 :D)单线解决方案快很多。

bsxfun 可能会做到这一点但根据我的经验,它也往往存在内存问题,但比repmat 少。

所以语法是:

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

但我强烈建议您先分析一下循环版本,然后再决定!很可能,由于内存限制,您可能别无选择:)

【讨论】:

  • 您对 BSXFUN 的看法可能是对的。它仍然会有内存问题,但我相信它通常比使用 REPMAT 做得略好。
  • 我喜欢 bsxfun 的一点是,在 2010a 和 2010b 版本中,它会原生多线程您的代码以提高性能,而无需您过多干预。
  • @JudoWill:太好了!我一直在寻找针对 repmat 的明确案例——你有任何相关文件吗?
  • 也许这个链接:mathworks.com/support/solutions/en/data/1-4PG4AN/…,正如你所看到的,多线程只适用于足够大的矩阵。
  • 正如最近的答案之一指出的那样,Matlab R2016b 似乎已将广播添加为标准功能。 (nickhigham.wordpress.com/2016/09/20/…)
【解决方案2】:

其他答案有点过时了——Matlab R2016b 似乎有added broadcasting as a standard feature。该博客文章中与问题匹配的示例:

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

【讨论】:

  • 2016b 中还有其他一些令人惊叹的新功能,例如可以用“+”连接的一流字符串 (mathworks.com/help/matlab/matlab_prog/create-string-arrays.html)。哦,我只是在讽刺:-)
  • 注意:广播很棒,但有时你得不到你想要的。我只花了 4 个小时在我的代码中追踪这个错误:x=(1-A+K*C)^-1; % A is an nxn matrix。 MATLAB 不知道我想要单位矩阵! (为他人的利益而分享)。
【解决方案3】:

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

也许

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

当然,您可以在原地执行此操作,但我不知道您是否想保留原始矩阵。

【讨论】:

  • 实际上,for 循环在大维度上(因为我从 size-3*(a lot) 数组的每一列中减去一个 size-3 向量),所以这就是为什么我害怕 for 循环。
  • 这样想——将你的数组分成 3 个大小为 1xN 的向量。然后从每个向量中减去相应的标量。所以 for 循环是沿着短维度的。
【解决方案4】:

实际上,http://www.frontiernet.net/~dmschwarz/genops.html(操作员使用 mex 文件重载)似乎也可以解决问题,尽管我还没有测试过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多