【问题标题】:How can I divide columns of a matrix by elements of a vector, element-wise?如何按元素将矩阵的列除以向量的元素?
【发布时间】:2015-10-02 09:36:47
【问题描述】:

给定一个矩阵和一个向量

A = [ 1 2; 2 4 ];
v = [ 2 4 ];

如何将矩阵的每一列除以向量的相应元素?下面的矩阵应该是

[ 1/2 2/4; 2/2 4/4 ]

基本上我想应用按列操作,每列的操作数存储在一个单独的向量中。

【问题讨论】:

    标签: matlab matrix division


    【解决方案1】:

    您应该使用rdividebsxfun 的组合:

    A = [ 1 2; 2 4 ];
    v = [ 2 4 ];
    B = bsxfun(@rdivide, A, v);
    

    rdivide 负责每个元素的划分,而bsxfun 确保维度相加。您可以通过类似的方式获得相同的结果

    B = A ./ repmat(v, size(A,1), 1)
    

    但是,使用repmat 会导致内存使用量增加,这就是为什么bsxfun 解决方案更可取的原因。

    【讨论】:

    • bsxfun 执行复制,因此引擎盖下的内存使用量也会增加,因此您可能需要在答案中的最后一个断言中小心。但是,它肯定比repmat 快,所以这是一个不错的选择。在此处查看一些出色的基准测试:stackoverflow.com/questions/12951453/…。另外,请参阅此处有关bsxfun 的内存使用情况:stackoverflow.com/questions/29800560/…
    • 感谢您的指点,这很有趣。我的印象是bsxfun 只是在重复使用现有的数组,但我认为我对此没有实际的参考。但我同意,bsxfunrepmat 更快,内存效率更高,所以没有任何理由不使用它。
    • 实际上看第二个帖子,内存使用增加了,但与repmat相比,它非常小,所以我认为你的最后一个断言是正确的。我收回了!
    【解决方案2】:

    使用 bsxfun 和右除 (rdivide) 运算符并利用广播:

    >> A = [ 1 2; 2 4 ];
    >> v = [ 2 4 ];
    >> out = bsxfun(@rdivide, A, v)
    
    out =
    
        0.5000    0.5000
        1.0000    1.0000
    

    bsxfun 的美妙之处在于,在这种情况下,v 的值将被复制到与A 中一样多的行,并且它将使用这个临时复制的矩阵执行元素智能除法A 中的值。

    【讨论】:

      猜你喜欢
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      相关资源
      最近更新 更多