我有一个包含30个条目的向量b
。
我想避免使用for
循环来构造这样的矩阵:
其中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]
结果是
是否有更快更通用的方法来生成此矩阵?
答案 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
请注意,我在矩阵运行中没有使用起始索引。根据您的需要调整该参数。