gpt4 book ai didi

arrays - 如何在 MATLAB 中基于索引向量添加矩阵的行?

转载 作者:行者123 更新时间:2023-12-03 07:50:48 25 4
gpt4 key购买 nike

如果我们有两个列向量索引和值,我们可以使用 Accumarray(indices, value) 来对重复值(即具有匹配索引的向量值的条目)求和。

当向量值变成矩阵时,是否有一种类似的方法可以工作,这样我们现在可以对整行而不是标量求和?

当然,一种方法是使用 arrayfun 并将accumarray分别应用于现在矩阵值的每一列,其形式为

cell2mat(arrayfun(@(x) accumarray(indices, values(:, x)), 1:size(values, 2), 'UniformOutput', false));

最佳答案

使用splitapply

splitapply 函数与accumarray 类似,但允许数据是多维的。例如,

values = [ 10  20  30
40 50 60
70 80 90
100 110 120
130 140 150 ];
indices = [2; 1; 2; 3; 1];
result = splitapply(@(x) sum(x,1), values, indices);

给出

result =
170 190 210
80 100 120
100 110 120

此方法的局限性在于,splitpplyaccumarray 不同,要求分组变量不跳过任何数字。例如 indexes = [2; 1; 2; 4; 1]; 无效。


使用稀疏

如果您想允许分组变量跳过数字,您可以使用 sparse ,利用此函数在匹配条目处添加值的事实:

values = [ 10  20  30
40 50 60
70 80 90
100 110 120
130 140 150 ];
indices = [2; 1; 2; 4; 1];
result = full(sparse(repmat(indices, 1, size(values,2)),...
repmat(1:size(values,2), size(values,1), 1),...
values));

给出

result =
170 190 210
80 100 120
0 0 0
100 110 120

使用矩阵乘法

您可以轻松地从分组变量构建一个二进制矩阵,这样将其与数据矩阵进行矩阵相乘即可​​得到所需的结果。此方法还允许跳过数字:

values = [ 10  20  30
40 50 60
70 80 90
100 110 120
130 140 150 ];
indices = [2; 1; 2; 4; 1];
result = (indices.'==(1:max(indices)).') * values;

再次给出

result =
170 190 210
80 100 120
0 0 0
100 110 120

关于arrays - 如何在 MATLAB 中基于索引向量添加矩阵的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77159154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com