假设给定一个具有奇数长度的对称行向量,其中每个元素都小于向量前半部分的下一个元素,并且每个元素都大于后半部分的下一个元素,并且中间元素是最大的。 (例如[1 2 3 2 1]
or [10 20 50 20 10]
).
我想创建一个方阵,其中行向量是它的中间行,等效的列向量(v'
)是它的中间列,每个其他行或列都是给定向量根据该行或列中的中间元素的缩减版本。当不再有“原始元素”时,我们将0
.
例子:
if v = [1 2 3 2 1]
we get
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
if v = [3 5 3]
we get
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的解决方案:
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
For v=[1 2 3 2 1]
起始块是hankel([3 2 1])
,即
ans =
3 2 1
2 1 0
1 0 0
从这里应该清楚发生了什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)