中值矩阵

时间:2012-09-07 13:00:35

标签: matlab logic

我是matlab的新手,我找不到合适的代码来执行以下操作。

我有这个矩阵(2列):

3,2348  265
2,2281  305
2,9321  315
3,6374  315
3,9069  355
1,8879  45
2,5944  45
3,3011  45
3,7679  95
4,1550  135
2,7442  135
4,1066  185
2,1129  185
1,7600  205
3,0655  225

我希望将其转换为此(2列):

2,5945  45
3,7680  95
3,4497  135
3,1098  185
1,7601  205
3,0656  225
3,2349  265
2,2281  305
3,2849  315
3,9070  355

目标是在matrix1中,对于col2中的每个重复值,我们执行col1中对应值的平均值。

例如,对于第1行,45(col2) - > col1=(1,8880+2,5944+3,3012)/3 = 2,5945

3 个答案:

答案 0 :(得分:3)

accumarray这是一个很好的工作:

A = [32348 265
     22281 305
     29321 315
     36374 315]; %# fill the rest of the matrix
[indices,ix] = sort(A(:,2),'ascend'); %# sort col2 in ascending order
data = A(ix,1); %# sort the values (col1) in the same way
groups = unique(indices);
mean_value = accumarray(indices, data, [numel(groups) 1], @mean);
%# the 4-argument version lets you specify a function to use (@mean in this case)

new_A = [mean_value groups]; %# this is the desired output

如需更多阅读,请查看this blog post

答案 1 :(得分:0)

这样的事情:

%A is the input matrix that you describe
A = [32348 265
     22281 305
     29321 315
     36374 315
     ...]

unique_values = unique(A(:, 2));
output = zeros(length(unique_values), 2);
for i=1:length(unique_values)
  output(i, 1) = mean(A(A(:, 2) == unique_values(i), 1));
end
output(:, 2) = unique_values;

unique(A(:, 2))在第二列中找到唯一值。 for循环查找每个唯一值的平均值。

答案 2 :(得分:0)

我能想到的最简单的代码( A 是你的输入矩阵):

A = sortrows(A,2);
[B,i,j] = unique(A(:,2));
A = [accumarray(j,A(:,1),size(i),@mean),B];