假设我得到一个奇数长度的对称行向量,其中每个元素在向量的前半部分小于下一个元素,在后半部分每个元素都大于下一个元素,中间元素是最大的。 (例如 [1 2 3 2 1]
或 [10 20 50 20 10]
)。
我想创建一个方阵,其中行向量是它的中间行,等效列向量 (v'
) 是它的中间列,其他行或列是根据此行或列中的中间元素给定向量。当不再有“原始元素”时,我们放置 0
。
例子:
如果 v = [1 2 3 2 1]
我们得到
0 0 1 0 0
0 1 2 1 0
1 2 3 2 1
0 1 2 1 0
0 0 1 0 0
如果 v = [3 5 3]
我们得到
0 3 0
3 5 3
0 3 0
到目前为止我做了什么:我设法创建了一个矩阵,其中 v
作为中间行,v'
作为中间列,我写了这段代码:
s = length(vector);
matrix= zeros(s);
matrix(round(s/2),:) = vector;
matrix(:, round(s/2)) = vector';
但无法分配其他值。
最佳答案
一种更实用的方法是将矩阵生成为马赛克,从 hankel
矩阵开始。为了进行性能比较,这里有一个使用与 @Divakar's solution 相同格式的版本:
function out=pyramid_hankel(v)
%I suggest checking v here
%it should be odd in length and a palindrome
i0=ceil(length(v)/2);
v2=v(i0:end);
Mtmp=hankel(v2);
out=zeros(length(v));
out(i0:end,i0:end)=Mtmp;
out(1:i0-1,i0:end)=flipud(Mtmp(2:end,:));
out(:,1:i0-1)=fliplr(out(:,i0+1:end));
>> pyramid_hankel([1 2 3 2 1])
ans =
0 0 1 0 0
0 1 2 1 0
1 2 3 2 1
0 1 2 1 0
0 0 1 0 0
对于v=[1 2 3 2 1]
,起始 block 是hankel([3 2 1])
,即
ans =
3 2 1
2 1 0
1 0 0
从这里应该清楚发生了什么。
关于arrays - 创建一个 "pyramid"矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33756154/