Вы можете использовать функцию accumarray , которая была разработана для ее решения:
Вот пример кода:
D = [2 0
3 1
3 1
1 1
7 0
6 0
7 1
6 1
1 0
1 0
7 1
6 1
4 1];
%Compute sums:
%Result: S(1) sumSecCol(where FirstCol = 1), S(2) = sumSecCol(where FirstCol = 2), S(3) = sumSecCol(where FirstCol = 3),
S = accumarray(D(:,1), D(:,2));
%Compute count (replace D(:,2) with "1"s):
C = accumarray(D(:,1), ones(size(D,1), 1));
%Remove zeros from C - to avoid division by zero
C = max(C, 1);
%Compute mean
M = S ./ C;
Результат:
M =
0.3333
0
1.0000
1.0000
0
0.6667
0.6667
Для случая шума "от 1 до 1,9, ... от 6 до 6,9" можно использовать функцию floor
:
D = floor(D);
от 1 до 1,9999 переходит к 1, 2 к 2.9999 переходит к 2 ...
Похоже, round
является более субтитром, но описанная вами операция применима floor
.
Вот решение, использующее для l oop без accumarray
:
S = zeros(7, 1);
C = zeros(7, 1);
D1 = D(:, 1); %First column
D2 = D(:, 2); %Second column
for i = 1:7
S(i) = sum(D2(D1 == i));
C(i) = sum(D1 == i);
end
M = S ./ max(C, 1);
Вместо find
рекомендуется использовать логический индексирование как указано выше.