我正在尝试找到一种矢量化的方法来执行以下操作 -
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
的行X
,w
的第二列应检索1
的行3
和X
,结果将是单行矩阵[5 5]
,另一个矩阵[0 1; -1 8]
,然后我可以mean()
点击[5 5]
以获取[-0.5 4.5]
,[5 5; -0.5 4.5]
(理想情况下形成矩阵X
)。
如何在没有循环的情况下执行此操作?
我的直觉是将ol.interaction.Select
转换为3D矩阵,但不确定如何。
答案 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
1
列i
中的w
个数,即数字在X
的{{1}}行i
中添加w'*X
行的行:
> sum(w)'
ans =
1
2
现在我们想要将第一个除以第二个,我们使用bsxfun
来广播除法运算(rdivide
,即逐个元素右分割./
)所以w'*X
和sum(w)'
的尺寸匹配。
一些有用的参考资料:
答案 1 :(得分:0)
使用find
,它返回给定向量的非零项的索引。例如,
X(find(w(:,1)), :)
返回[5 5]
同样,X(find(w(:, 2)), :)
返回
0 1
-1 8
然后你可以继续使用均值等,并最终像C = [A; B]
一样垂直叠加生成的矩阵。