2013-11-28 74 views
3

我正在模拟一个矩阵(假设一个5x5矩阵)。这个矩阵的其中一个元素是已知的(后面的正方形在下面;这个位置不会总是在中心),我想从该位置开始并螺旋地访问其他元素(我已经显示了数量上的顺序)。如何在大矩阵中定义这个顺序(例如1000x1000)?因为我无法手动执行此操作,所以我正在寻找更具启发性的方法。订单制作矩阵在matlab中

我在matlab中使用bwdist然后对获得的矩阵进行排序,但结果并不像我想要的那样。

任何更好的解决方案?

enter image description here

+1

拾取元素不在中心时的排序是什么? – Mikhail

+0

看看这个算法 - 它会给你一个稍微不同的螺旋:http://cnr.lwlss.net/RasterArchimedes/ – Dan

回答

3

当元素是在市中心,只需使用spiral命令:

>> spiral(5) 

ans = 

    21 22 23 24 25 
    20  7  8  9 10 
    19  6  1  2 11 
    18  5  4  3 12 
    17 16 15 14 13 

为出发点的任意位置,我们需要做的手

让我们的东西利用这个花式的spiral函数。要获得答案矩阵A,请在起点位于中心的较大矩阵M中进行设置。请注意,AM中元素的相对顺序是相同的。所有我们需要的是让A作为子矩阵从M,并以相同的顺序元素的连续阵列填充:

function A = spiral_generic(n, P) 
% Makes NxN matrix filled up spirally starting with point P 
    r = max([P - 1, n - P]);    % Radius of the bigger matrix 
    M = spiral(2 * r + 1);    % Bigger matrix itself 
    C = r + 1 - (P - 1);     % Top-left corner of A in M 
    A = M(C(1):C(1)+n-1, C(2):C(2)+n-1); % Get the submatrix 
    [~, order] = sort(A(:));    % Get elements' order 
    A(order) = 1:n^2;      % Fill with continous values 
end 

而这里的工作原理是:

>> spiral_generic(5, [3 2]) 

ans = 

    17 18 19 20 21 
    7  8  9 10 22 
    6  1  2 11 23 
    5  4  3 12 24 
    16 15 14 13 25 

>> spiral_generic(6, [2 5]) 

ans = 

    36 25 16  7  8  9 
    35 24 15  6  1  2 
    34 23 14  5  4  3 
    33 22 13 12 11 10 
    32 21 20 19 18 17 
    31 30 29 28 27 26 

这不是最快解决方案,因为它需要排序,因此与直接执行O(N^2)相比,需要花费O(N^2 logN)时间。但它非常短,对于1000x1000左右的矩阵足够快。

+0

我编辑了这个问题,正如你所看到的,我需要像matlab中的螺旋命令它应该从哪个位置开始。 – Sam

+0

好吧,现在就来。看到我更新的答案。 – Mikhail

+0

tnx,它现在的作品:) – Sam