我是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
答案 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];