0

私は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

4

3 に答える 3

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

詳細については、このブログ投稿をご覧ください。

于 2012-09-07T13:53:57.667 に答える
0

私が思いついた最も単純なコード(Aは入力行列です):

A = sortrows(A,2);
[B,i,j] = unique(A(:,2));
A = [accumarray(j,A(:,1),size(i),@mean),B];
于 2012-09-07T22:24:43.480 に答える
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))2 番目の列で一意の値を見つけます。ループは、これらのfor一意の値ごとに平均を見つけます。

于 2012-09-07T13:27:02.387 に答える