arrays - 创建一个 "pyramid"矩阵

标签 arrays matlab matrix

假设我得到一个奇数长度的对称行向量,其中每个元素在向量的前半部分小于下一个元素,在后半部分每个元素都大于下一个元素,中间元素是最大的。 (例如 [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/

相关文章:

javascript - 从数组中获取唯一的随机项

Matlab 打印图形到 eps 一致地切割轴标签

c++ 相当于 matlab max(find(array < x) 和 min(find(array > x)

matlab - 不使用 hough 函数在 MATLAB 中进行 Hough 变换

matlab - 将长二维矩阵拆分为三维

java - 使用 Mahout 数学课创建矩阵时出现问题

java - 打印给定矩阵的行

c++ - 如何在 C++ header 中声明数组?

c - 使用 malloc 和 realloc 动态重新分配结构体数组

java - 获取用户在线/离线状态