根据数组的长度创建数字模式
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
根据数组的长度创建一个数字模式,这个例子很小,只是显示了如果数组的大小为 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