使用另一个矩阵

时间:2016-12-31 05:06:19

标签: matrix octave addressing

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

X =
   0   1
   5   5
  -1   8

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

我想使用X的列索引w的行,因此w的第一列应检索2的行Xw的第二列应检索1的行3X,结果将是单行矩阵[5 5],另一个矩阵[0 1; -1 8],然后我可以mean()点击[5 5]以获取[-0.5 4.5][5 5; -0.5 4.5](理想情况下形成矩阵X)。

如何在没有循环的情况下执行此操作? 我的直觉是将ol.interaction.Select转换为3D矩阵,但不确定如何。

2 个答案:

答案 0 :(得分:1)

您可以使用以下单行:

viewDidLoad

结果:

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 1i中的w个数,即数字在X的{​​{1}}行i中添加w'*X行的行:

> sum(w)'
ans =

   1
   2

现在我们想要将第一个除以第二个,我们使用bsxfun来广播除法运算(rdivide,即逐个元素右分割./)所以w'*Xsum(w)'的尺寸匹配。

一些有用的参考资料:

答案 1 :(得分:0)

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

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

返回[5 5]

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

   0   1
  -1   8

然后你可以继续使用均值等,并最终像C = [A; B]一样垂直叠加生成的矩阵。