根据数组的长度创建数字模式

Creating a number pattern based on the length of an array

根据数组的长度创建一个数字模式,这个例子很小,只是显示了如果数组的大小为 5,6 或 7 会是什么样子。(数组的实际长度约为 400,000 )

我怎样才能得到这个数字模式。我在想它看起来有点像帕斯卡的三角形,但数字不对。

我正在使用 Octave 3.8.1,它类似于 Matlab


示例:如果数组的长度为 5,则该系列将为

a1=[1 1 1;1 2 2;1 2 3;1 2 2;1 1 1]
a2=[1 1 1;2 2 1;3 2 1;2 2 1;1 1 1]

示例:如果一个数组的长度为 6,则该系列将为

a1=[1 1 1;1 2 2;1 2 3;1 2 3;1 2 2;1 1 1]
a2=[1 1 1;2 2 1;3 2 1;3 2 1;2 2 1;1 1 1]

示例:如果一个数组的长度为 7,则该系列将是

a1=[1 1 1 1;1 2 2 2;1 2 3 3;1 2 3 4;1 2 3 3;1 2 2 2;1 1 1 1]
a2=[1 1 1 1;2 2 2 1;3 3 2 1;4 3 2 1;3 3 2 1;2 2 2 1;1 1 1 1]

见下图:

这就是你想要的:

n = 7;
a1 = cumsum(tril(ones(ceil(n/2))), 2);
a1 = a1([1:end end-mod(n,2):-1:1],:);
a2 = fliplr(a1);

这应该很快:

n = 9;

a1 = bsxfun(@min, min(1:n,n:-1:1).', 1:ceil(n/2));
a2 = a1(:,end:-1:1);

略有不同的方法:

对于m = ceil(n/2);bsxfun可以用

代替
X = gallery('minij',m);

等于:

X = bsxfun(@min, 1:m,(1:m).') 

所以你得到一个块,你只需要连接输出。

a1 = [X; flipud(X)]
if n ~= 2*m; a1(m,:) = []; end  %// clear one row if necessary
a2 = fliplr(a1)

n = 6 你得到

a1 =
     1     1     1
     1     2     2
     1     2     3
     1     2     3
     1     2     2
     1     1     1

a2 相应地镜像。 n = 5

a1 =
     1     1     1
     1     2     2
     1     2     3
     1     2     2
     1     1     1