我正在处理一个问题,该问题要求我对数组元素进行分组并对每组进行平均。例如,考虑4 x 4矩阵M,
M = [ 1 0 0 1;
1 0 1 1;
1 1 0 1;
0 0 0 1;]
我想把它分成一个2x2矩阵,取元素的平均值,这样我们就可以得到
M1 = [0.5 0.75;
0.5 0.5;]
有人知道怎么做吗?
非常感谢
您可以使用conv2
和一点索引来完成此操作,如下所示:
>> A = conv2(M,ones(2), 'same');
>> A(1:2:end,1:2:end)/4
ans =
0.5000 0.7500
0.5000 0.5000
我认为方法是首先使用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
>>
您可以对任何矩形执行类似操作,其中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
您可以循环分组矩阵,然后计算平均
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