给定矩阵:
a =
1 1 2 2
1 1 2 2
3 3 4 4
3 3 4 4
我想得到以下四个 2x2 矩阵:
a1 =
1 1
1 1
a2 =
2 2
2 2
a3 =
3 3
3 3
a4 =
4 4
4 4
从那里,我想取每个矩阵的最大值,然后将结果 reshape 为 2x2 结果矩阵,如下所示:
r =
1 2
3 4
结果最大值相对于它们在初始矩阵中的原始位置的位置很重要。
目前,我正在使用以下代码来完成此任务:
w = 2
S = zeros(size(A, 1)/w);
for i = 1:size(S)
for j = 1:size(S)
Window = A(i*w-1:i*w, j*w-1:j*w);
S(i, j) = max(max(Window));
end
end
这可行,但似乎必须有一种不涉及迭代(矢量化)的方法。
我试过像这样使用 reshape :
reshape (最大(最大( reshape (A,w,w,[]))),w,w,[])
然而,这取了错误值的最大值并返回:
ans =
3 4
3 4
有没有什么方法可以在没有迭代的情况下完成这个或者改进我的迭代方法?
最佳答案
更新:我不确定我是如何获得最多选票的(截至 2012 年 10 月 28 日)。对于阅读本文的任何人,请参阅 angainor 或 Rody 的答案以获得不需要任何额外工具箱的更好解决方案。
这是迄今为止每个答案的赛马(不包括 Nates - 抱歉,没有必要的工具箱):
Z = 1000;
A = [1 1 2 2; 1 1 2 2; 3 3 4 4; 3 3 4 4];
w = 2;
%Method 1 (OP method)
tic
for z = 1:Z
S = zeros(size(A, 1)/w);
for i = 1:size(S)
for j = 1:size(S)
Window = A(i*w-1:i*w, j*w-1:j*w);
S(i, j) = max(max(Window));
end
end
end
toc
%Method 2 (My double loop with improved indexing)
tic
for z = 1:Z
wm = w - 1;
Soln2 = NaN(w, w);
for m = 1:w:size(A, 2)
for n = 1:w:size(A, 1)
Soln2((m+1)/2, (n+1)/2) = max(max(A(n:n+wm, m:m+wm)));
end
end
Soln2 = Soln2';
end
toc
%Method 3 (My one line method)
tic
for z = 1:Z
Soln = cell2mat(cellfun(@max, cellfun(@max, mat2cell(A, [w w], [w w]), 'UniformOutput', false), 'UniformOutput', false));
end
toc
%Method 4 (Rody's method)
tic
for z = 1:Z
b = [A(1:2,:) A(3:4,:)];
reshape(max(reshape(b, 4,[])), 2,2);
end
toc
速度测试(z
循环)的结果是:
Elapsed time is 0.042246 seconds.
Elapsed time is 0.019071 seconds.
Elapsed time is 0.165239 seconds.
Elapsed time is 0.011743 seconds.
糟了!看来罗迪 (+1) 是赢家。 :-)
更新:新参赛者 angainor (+1) 领先!
关于matlab - 在 MATLAB 中取最大值的连续矩阵 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13063502/