定期从矢量构造矩阵

时间:2017-09-12 11:06:48

标签: matlab matrix vectorization

我有一个包含30个条目的向量b

我想避免使用for循环来构造这样的矩阵:

enter image description here

其中b_i是向量i的{​​{1}}条目。

例如,定义向量

b

我尝试使用for循环是:

b = [2 6 -7 3 1 -4 -1  1 11  8 -4  9  2  0  2 -1  0  4  4  4  2 -4  2  5  1 3  2 -1  1 -2]

结果是

enter image description here

是否有更快更通用的方法来生成此矩阵?

3 个答案:

答案 0 :(得分:6)

您可以使用toeplitz

A=fliplr(toeplitz(b(10:14),b(10:-1:6))

A =

-4    -1     1    11     8
-1     1    11     8    -4
 1    11     8    -4     9
11     8    -4     9     2
 8    -4     9     2     0

顺便说一句,这里的索引是6到14,如图所示,而不是图片中的7到15。您可以将其更改为您的首选目的。

答案 1 :(得分:3)

你的直觉是避免for循环。这是一个很好的直觉,可以作为MATLAB程序员开发,但它并不总是最快的选项。从my answer to a very similar question中可以看出,for循环可能是生成此类矩阵的最快方法。

可能最短的编写方法是使用hankel

A = b(hankel(7:11, 11:15));

输出:

>> ans =

    -1     1    11     8    -4
     1    11     8    -4     9
    11     8    -4     9     2
     8    -4     9     2     0
    -4     9     2     0     2

等效结果(但更快的处理,如之前链接的答案所示)

A = hankel(b(7:11), b(11:15));

正如Adiel所说,您在矩阵图像中显示的索引与您用于创建示例的索引之间存在差异。这使用前者。

答案 2 :(得分:2)

不如使用toeplitz那么好,但更清楚一点,看看发生了什么:

b = [2 6 -7 3 1 -4 -1  1 11  8 -4  9  2  0  2 -1  0  4  4  4  2 -4  2  5  1 3  2 -1  1 -2];
n = 5; % window size
% StartIdx = 4; % Starting index of your window
AddVec = repelem(1:n,5)+StartIdx; % create addition vector
IdxVec = repmat(1:n,1,n); % Initialise index vector
IdxVec = AddVec+IdxVec; % add to let the window "slide"
c = b(IdxVec); % create a new vector
d = reshape(c,n,[]) % Reshape to get the desired matrix

d =

     6    -7     3     1    -4
    -7     3     1    -4    -1
     3     1    -4    -1     1
     1    -4    -1     1    11
    -4    -1     1    11     8

请注意,我在矩阵运行中没有使用起始索引。根据您的需要调整该参数。