根据数组的长度创建数字模式,示例很小,只显示数组大小为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]
见下图:
答案 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