如何在matlab中使用单个向量创建周期矩阵?

时间:2018-04-19 19:16:41

标签: arrays matlab matrix

我试图从57142x1的给定矢量创建圆形或周期性的筛选矩阵,这是我的实际矢量,但是对于测试我尝试使用简单的3x1矢量。我在Matlab中使用circshift的代码是

v=[1 2 3]';
A=[];
A=[v,circshift(v,1),circshift(v,2)];

对于这段代码,我得到了答案:

A =
     1     3     2
     2     1     3
     3     2     1

所以我得到了3x1小矢量的正确输出,但是我应该如何使用57142x1矢量的循环或基于矢量的方法呢?

3 个答案:

答案 0 :(得分:2)

使用for循环:

 N=57142;
 v=[1:N].';
 A=zeros(size(v));

 for j=1:N
     A(:,j)=circshift(v,j);
 end

可以使用一些内置函数以更简洁的形式对其进行编码,例如: arrayfun,但这不会改善效果。

作为替代方案,优雅的解决方案是使用toeplitz函数:

 N=57142;
 v=[1:N].';
 toeplitz(v,[v(1);flip(v(2:end))]);

编辑: 另请注意,大小为57142x57142的双数组需要24.3 GB RAM。小心!

答案 1 :(得分:1)

以下适用于任意大小:

v = [1 2 3].';
n = numel(v);
A = v(mod(bsxfun(@minus, (1:n).', 0:n-1) - 1, n) + 1);

答案 2 :(得分:1)

一种简单的方法:

v=[1 2 3]';
A = [];
for j = 1:length(v)
    A = [A,circshift(v,j-1)];
end

现在,您可以将'v'替换为任何通用矩阵。