首页 文章

Matlab相当于Numpy广播?

提问于
浏览
20

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

这可能吗?

4 回答

  • 11

    由于像just-in-time acceleration (JITA)这样的编译器优化,MATLAB中的循环也不错 . 大多数时候,我注意到当前MATLAB版本中的循环解决方案比复杂的(虽然很酷:D)单行程快得多 .

    根据我的经验,bsxfun可能会发挥作用,它往往会有内存问题,但不如 repmat .

    所以语法是:

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

    但我恳请你介绍一下loopy版本,然后决定!最有可能的是,由于内存限制,您可能没有选择:)

  • 4

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

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

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

    也许吧

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

    当然,你可以这样做,但我不知道你是否想要保留原始矩阵 .

  • 18

    实际上,似乎http://www.frontiernet.net/~dmschwarz/genops.html(运算符重载mex文件)也可以做到这一点,即使我还没有测试过它 .

相关问题