2

让我们简单一点,假设我在 matlab 中有一个 10x3 矩阵。每行前两列中的数字表示 x 和 y(位置),第三列中的数字表示相应的值。例如,[1 4 12]显示 x=1 和 y=4 中的函数值等于 12。我在不同的行中也有相同的 x 和 y,我想对具有相同 x,y 的值进行平均。并用平均的替换所有这些。

例如 :

A = [1 4 12 
     1 4 14
     1 4 10
     1 5 5
     1 5 7];

我希望有

B = [1 4 12
     1 5 6] 

我真的很感谢你的帮助谢谢阿里

4

4 回答 4

2

像这样?

A = [1 4 12;1 4 14;1 4 10; 1 5 5;1 5 7];
[x,y] = consolidator(A(:,1:2),A(:,3),@mean);
B = [x,y]
B =
     1     4    12
     1     5     6

Consolidator在文件交换上。

于 2013-08-02T19:27:12.370 回答
1

使用内置函数:

sparsemean = accumarray(A(:,1:2), A(:,3).', [], @mean, 0, true);
[i,j,v] = find(sparsemean);
B = [i.' j.' v.'];
于 2013-08-02T19:34:38.993 回答
0

用于unique获取唯一行并使用返回的索引数组来查找应该平均的行并要求accumarray执行平均部分:

[C,~,J]=unique(A(:,1:2), 'rows');
B=[C, accumarray(J,A(:,3),[],@mean)];

对于你的例子

>> [C,~,J]=unique(A(:,1:2), 'rows')
C =
     1     4
     1     5
J =
     1
     1
     1
     2
     2

C包含唯一行并J显示原始矩阵中的哪些行对应于Cthen中的行

>> accumarray(J,A(:,3),[],@mean)
ans =
    12
     6

返回所需的平均值和

>> B=[C, accumarray(J,A(:,3),[],@mean)]
B =
     1     4    12
     1     5     6

是答案。

于 2013-08-02T22:01:42.650 回答
0
A = [1 4 12;1 4 14;1 4 10; 1 5 5;1 5 7]; %your example data
B = unique(A(:, 1:2), 'rows'); %find the unique xy pairs
C = nan(length(B), 1);

% calculate means
for ii = 1:length(B)
    C(ii) = mean(A(A(:, 1) == B(ii, 1) & A(:, 2) == B(ii, 2), 3));
end

C =
    12
     6

循环内的步骤for使用逻辑索引来查找与循环中当前 xy 对匹配的行的平均值。

于 2013-08-02T19:34:45.827 回答