【问题标题】:Get the rows of a matrix using another matrix使用另一个矩阵获取矩阵的行
【发布时间】:2016-12-31 05:06:19
【问题描述】:

我正在尝试找到一种矢量化方式来执行以下操作 -

X =
   0   1
   5   5
  -1   8

> w=[false true; true false; false true]  
w = 
      0  1
      1  0
      0  1

我想使用w 的列索引X 的行,所以w 的第一列应该检索X 的行2,而w 的第二列应该检索X 的行13,结果将是一个单行矩阵[5 5] 和另一个矩阵[0 1; -1 8],然后我可以将每个矩阵都用mean() 得到[5 5] ,和[-0.5 4.5](理想情况下形成一个矩阵[5 5; -0.5 4.5])。

如何在没有循环的情况下做到这一点? 我的直觉是可以通过将X 转换为 3D 矩阵,但不确定如何。

【问题讨论】:

    标签: matrix octave addressing


    【解决方案1】:

    您可以使用以下单线:

    bsxfun(@rdivide, w'*X, sum(w)')
    

    结果:

    ans =
    
       5.00000   5.00000
      -0.50000   4.50000
    

    bsxfun是你的朋友!

    说明

    w'*X 生成一个矩阵,其每一行都是X 的指定行的总和:

    > w'*X
    ans =
    
       5   5
      -1   9
    

    但是,您需要的是平均值,而不是总和。 为此,我们应该将每一行除以相加的元素数。 操作sum(w)'生成一个向量,其i-th元素是wi-th列中1s的个数,即X的行数相加在i-第w'*X行:

    > sum(w)'
    ans =
    
       1
       2
    

    现在我们想将第一个除以第二个,我们使用bsxfun广播除法运算(rdivide,即逐个元素右除./)使得@987654341的维度@ 和 sum(w)' 匹配。

    一些有用的参考资料:

    【讨论】:

      【解决方案2】:

      使用find,它返回给定向量的非零条目的索引。例如,

      X(find(w(:,1)), :)
      

      返回 [5 5]

      同样,X(find(w(:, 2)), :) 返回

         0   1
        -1   8
      

      然后您可以继续进行均值等处理,最终将生成的矩阵垂直堆叠,如C = [A; B]

      【讨论】:

      • 谢谢。我很想知道是否有一种方法可以在不使用 w 列上的循环的情况下通过将 X 扩展为 3D 矩阵以及巧妙地使用 bsxfun() 来做到这一点?
      猜你喜欢
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多