Есть ли способ сгруппировать элементы матрицы в Matlab? - PullRequest
1 голос
/ 06 августа 2020

Я работаю над проблемой, которая требует от меня сгруппировать элементы массива и усреднить каждую группу. Например, рассмотрим матрицу M 4 x 4,

M = [ 1 0 0 1;
      1 0 1 1;
      1 1 0 1;
      0 0 0 1;]

Я хочу сгруппировать это в матрицу 2 x 2, взяв среднее значение элементов, чтобы мы получили

M1 = [0.5 0.75;
      0.5 0.5;]

Кто-нибудь знает, как это сделать?

Большое спасибо

Ответы [ 4 ]

1 голос
/ 07 августа 2020

Вы можете сделать это, используя conv2 и небольшую индексацию, например:

>> A = conv2(M,ones(2), 'same');
>> A(1:2:end,1:2:end)/4

ans =

    0.5000    0.7500
    0.5000    0.5000
0 голосов
/ 06 августа 2020

Вы можете сделать что-то подобное для любого прямоугольника, где x и y обозначают размер доменов, которые вы хотите усреднить.

function M1 = get_means(M, x, y) 
    [rows, cols] = size(M);
    if mod(rows, x) == 0 && mod(cols, y) == 0
        for i = 1:y:cols
            for j = 1:x:rows
                M1((j+x-1)/x, (i+y-1)/y) = sum(M(j:j+x-1,i:i+y-1),'all')/(x*y);
            end
        end
    else
        error('The matrix doesn''t have compatible dimensions.')
    end
end
0 голосов
/ 06 августа 2020

Вы можете l oop по сгруппированным матрицам, а затем вычислить среднее

M = [ 1 0 0 1;
      1 0 1 1;
      1 1 0 1;
      0 0 0 1;];

n=2; % 2x2 mat
 
% create new matrix with means
MM = zeros(n,n);
 
% row counter for mean-Matrix
r=1;

% loop over matrix groups
for row=1:n:size(M,1)
    c = 1; % column counter for mean-Matrix
    for col=1:n:size(M,2)
        MM(r,c) = mean(mean(M(row:row+n-1, col:col+n-1)));
        c = c+1;
    end
    r = r+1;
end

Результат:

MM =

0.5000    0.7500
0.5000    0.5000
0 голосов
/ 06 августа 2020

Я думаю, что способ go - сначала разделить вашу матрицу на части с помощью mat2cell, затем применить ваши функции к каждой части и объединить их в новую матрицу:

>> M = [ 1 0 0 1;
1 0 1 1;
1 1 0 1;
0 0 0 1;]

M =

     1     0     0     1
     1     0     1     1
     1     1     0     1
     0     0     0     1

>> T=mat2cell(M, [2 2], [2 2])

T =

  2×2 cell array

    {2×2 double}    {2×2 double}
    {2×2 double}    {2×2 double}

>> M1 = cellfun(@mean, cellfun(@mean, T, 'UniformOutput', false))

M1 =

    0.5000    0.7500
    0.5000    0.5000

>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...