【发布时间】:2012-10-25 07:17:39
【问题描述】:
给定矩阵:
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
从那里,我想取每个矩阵的最大值,然后将结果重塑为 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(max(max(reshape(A, w, w, []))), w, w, [])
然而,这需要错误值的最大值并返回:
ans =
3 4
3 4
有没有什么方法可以在不进行迭代的情况下完成此任务或以其他方式改进我的迭代方法?
【问题讨论】:
-
这是一种比循环慢 4 倍的单行方法:
Soln = cell2mat(cellfun(@max, cellfun(@max, mat2cell(A, [2 2], [2 2]), 'UniformOutput', false), 'UniformOutput', false));。你确实问过如何在没有迭代的情况下做到这一点 :-) 但我将其作为评论,而不是答案,因为从速度的角度来看,迭代确实更可取。 -
您是否需要中间 2x2 矩阵来做其他事情,或者您只是对最终矩阵
r感兴趣? -
是的,我也是这么想的……
-
另外,数组有多大?总是 4x4 和 2x2 窗口?
-
我不需要中间的 2x2 矩阵,只需要最终矩阵。矩阵几乎总是大于 4x4,最大值可以用于原始矩阵上的任何矩阵平铺。对于 60x60 矩阵,平铺可以是 2x2、3x3、4x4 等。
标签: matlab matrix vectorization