mat*_*bit 1 matlab grouping matrix-indexing
我有以下数据:
A = [1 2 ; 3 2; 4 7; 10 2; 6 7; 10 9]
B = [1 2 3; 4 4 9; 1 8 0; 3 7 9; 3 6 8]
C = [4; 10; 6; 3; 1]
A =
1 2
3 2
4 7
10 2
6 7
10 9
B =
1 2 3
4 4 9
1 8 0
3 7 9
3 6 8
C.' =
4 10 6 3 1
Run Code Online (Sandbox Code Playgroud)
对于A(:,2)我需要取相应值的每个唯一值A(:,1),查找它们的值C,然后取相关的行B并计算它们的平均值.结果应该是length(unique(A(:,2))x size(B,2);
此示例的预期结果:
B
说明的行2,4和5的平均值:对应于值"2"的A索引1,3和10 在索引2,4,5中C.与此相对应:
B.B.我现在计算它通过应用unique上A并遍历每个值,寻找合适的指标.我的数据集很大,所以需要很长时间.我该如何避免循环?
让我们一步一步地在问题中做你说的话:
对于以下每个唯一值 A(:, 2):
[U, ia, iu] = unique(A(:, 2));
Run Code Online (Sandbox Code Playgroud)获取相应的值 A(:, 1) 并在 C以下位置查找其值:
[tf, loc] = ismember(A(:, 1), C);
Run Code Online (Sandbox Code Playgroud)
为了以防万一,还建议确保所有值都在C以下位置找到:
assert(all(tf))
Run Code Online (Sandbox Code Playgroud)然后取相关的行 B 并计算它们的平均值:
[X, Y] = meshgrid(1:size(B, 2), iu);
result = accumarray([Y(:), X(:)], reshape(B(loc, :), 1, []), [], @mean);
Run Code Online (Sandbox Code Playgroud)希望这可以帮助!:)
%// Sample input
A = [1 2 ; 3 2; 4 7; 10 2; 6 7; 10 9];
B = [1 2 3; 4 4 9; 1 8 0; 3 7 9; 3 6 8];
C = [4; 10; 6; 3; 1];
%// Compute means
[U, ia, iu] = unique(A(:, 2));
[tf, loc] = ismember(A(:, 1), C);
[X, Y] = meshgrid(1:size(B, 2), iu);
result = accumarray([Y(:), X(:)], reshape(B(loc, :), [], 1), [], @mean);
Run Code Online (Sandbox Code Playgroud)
结果是:
result =
3.3333 5.6667 8.6667
1.0000 5.0000 1.5000
4.0000 4.0000 9.0000
Run Code Online (Sandbox Code Playgroud)