matlab - 在 MATLAB 中取最大值的连续矩阵 block

标签 matlab matrix vectorization

给定矩阵:

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/

相关文章:

c++ - 如何用 g++ 向量化我的循环?

matlab - 优化嵌套循环以计算矩阵行的xcorr

matlab - matlab中svmtrain数据输入顺序

Matlab:向图中添加符号

arrays - channel 元素类型太大 Golang

python - 如何计算累积总和直到达到阈值并在达到阈值后重置它考虑Python中的pandas数据帧中的组?

Matlab交叉验证和K-NN

matlab - 如何在matlab中写这个矩阵,

python,测试矩阵中的所有值是否小于 numpy.finfo(float).eps

python - 将带有坐标的一维数组转换为numpy中的二维数组