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

时间:2015-03-13 11:43:33

标签: matlab math matrix octave

根据数组的长度创建数字模式,示例很小,只显示数组大小为5,6或7的情况。(数组的实际长度约为400,000)< / p>

我怎样才能获得这种数字模式。我觉得它看起来有点像Pascal的三角形,但数字已经关闭了。

我正在使用 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]

见下图: Image of number pattern going up and going down

3 个答案:

答案 0 :(得分:3)

这样做你想要的:

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

答案 1 :(得分:3)

这应该非常快:

n = 9;

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

答案 2 :(得分:3)

略有不同的方法:

对于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