【问题标题】:Matlab - moving window, avoiding nested loopsMatlab - 移动窗口,避免嵌套循环
【发布时间】:2011-03-10 16:24:50
【问题描述】:

我正在尝试编写一个没有嵌套循环的“加权移动窗口”以提高速度。 我已经尝试过使用arrayfun,但没有得到令人兴奋的结果,但也许我做错了。

窗口在每个位置都有不同的权重(存储在 B 中),应叠加在矩阵 A 上,返回矩阵 A 位于窗口内的值乘以该位置的窗口权重(从乙)。 此外,窗口可以相互重叠,在这种情况下,应保持最大值。 最后窗口的尺寸和位移应该是函数的参数。

看起来比实际更难,所以我向你展示我想要改进的代码:

A = reshape([1:35],7,5)';   % values matrix
B = [1:3;4:6];              % window s weight matrix

% matrices size
[m n] = size(A);
[a b] = size(B);

% window s parameters
shift = 2;                  % window s movement at each iteration
zone = 3;                   % window s size (zone x zone)

% preallocation
C = ones(m,n);              % to store the right weight to be applied in each position

% loop through positions and find the best weight when they overlap
for i=1:m
    for j=1:n
       C(i,j) = max(max(B( max(round((i-zone)/shift)+1,1) : min(ceil(i/shift),a) , max(round((j-zone)/shift)+1,1) : min(ceil(j/shift),b))));
    end
end

% find the output of the windows
result = C.*A;

我希望我说清楚了,但是如果您需要更多详细信息,请询问。 提前感谢您的帮助!

【问题讨论】:

  • 什么是zoneshift?除非定义了这两个参数,否则您发布的代码将不会运行。
  • 对不起,我忘记复制和粘贴这些行了。它们是分别定义窗口尺寸(区域 x 区域)和窗口移动(即:每次迭代中窗口的移动)的参数。我已经更改了代码,现在它应该可以工作了。

标签: matlab for-loop


【解决方案1】:

如果您有权访问图像处理工具箱,您会想要查看perform sliding neighborhood operations 的方法。特别是我觉得NLFILTER这个函数可以达到你想要的效果:

A = reshape([1:35],7,5)';  %'# Matrix to be filtered
B = [1:3;4:6];              %# Window weights
result = nlfilter(A,[2 3],@(M) max(M(:).*B(:)));

【讨论】:

  • 感谢您的快速答复。对于 shift=1,滑动邻域操作会很好,但在我看来,没有办法选择自定义班次。
【解决方案2】:

我会使用im2col. 假设您的图像是 j x k,并且您的窗口是 m x n,您将得到一个 mn x (j-m+1)*(k-n+1) 的矩阵。然后,你可以只取其他每一列。

示例代码:

%A = your_image
B = im2col(A, [m n],'sliding');
C = B(:,1:2:end);

还有带有“shift 2”的滑动窗口。

【讨论】:

  • 这是一个有趣的解决方案,但不能解决部分问题。如果我有一个 zone=3 和 shift=2 的移动窗口(更一般地说,对于每个 shift 小于 zone 的窗口都是如此),一个窗口和下一个窗口将部分叠加(即:包含部分相同值)。这不能用 C = B(:,1:2:end) 来完成。但仍然是处理矩阵的一种有趣方式,谢谢!
【解决方案3】:

试试filter

例如,对超过 5 个元素进行窗口平均:

outdata = filter([ 0.2 0.2 0.2 0.2 0.2 ], 1, indata);

【讨论】:

    猜你喜欢
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 2017-08-27
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多