Как получить среднее количество столбцов, сгруппированных по определенному столбцу? - PullRequest
0 голосов
/ 12 июня 2018

Рассмотрим следующую матрицу в MATLAB:

      %  x y z  V
data = [ 1 1 1  6
         1 1 2  7
         1 1 3  8
         1 2 1  6
         1 2 2  7
         1 2 3  9
         1 3 1  6
         1 3 2  4
         1 3 3  8
         2 1 1  9
         2 1 2  8]

Как получить профиль (V против z) путем усреднения по соответствующим x и y?

Результат, в этом случае, должен быть:

B = [1, (6+6+6+9)/4); 
     2, (7+7+4+8)/4); 
     3,   (8+9+9)/3 ]

Среднее значение по всем V с одинаковым Z.

Однако исходные данные содержатреальные значения:

0.815210000000000   1.30799000000000    -84.8230000000000   -5.90987000000000
0.815210000000000   2.42194000000000    -84.8230000000000   -0.236048000000000
0.815210000000000   3.53589000000000    -84.8230000000000   3.19780000000000
0.815210000000000   4.64984000000000    -84.8230000000000   5.48969000000000
0.815210000000000   5.76379000000000    -84.8230000000000   6.42475000000000
0.815210000000000   6.87774000000000    -84.8230000000000   5.97255000000000
0.815210000000000   7.99169000000000    -84.8230000000000   4.25794000000000
0.815210000000000   9.10564000000000    -84.8230000000000   1.49070000000000
0.815210000000000   10.2196000000000    -84.8230000000000   -2.10373000000000

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Используйте accumarray, чтобы найти среднее значение групп.Для получения B.

[C, ~, ic]=  unique(data(:,3));
B = [C  accumarray(ic,data(:,4),[],@mean)]

добавьте в столбец значения unique 3-го столбца. Будьте внимательны со значениями с плавающей запятой, если значения третьего столбца не равны действительно точно так же, тогда используйте uniquetol.

0 голосов
/ 13 июня 2018

Я решил проблему, используя свои знания по программированию на других языках:

A = sortrows(data, 3);
G = unique(A(:, 3));
n = size(G,1);
num = size(A,1);
B = zeros(n,2);
i =1;
oldZ=A(1,3);
sum = 0;
m =0;
for row=1:num
    z = A(row,3);
    if z ~= oldZ
        B(i,1) =oldZ;
        B(i,2)= sum/m;
        sum = 0;
        m =0;
        oldZ = z;
        i = i+1;
    end
    V = A(row,4);
    sum = sum + V;
    m = m +1;
end

B(i,1) =oldZ;
B(i,2)= sum/m;

B - запрашиваемый профиль, который является средним в плоскости xy вдоль z.

...