我试图从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矢量的循环或基于矢量的方法呢?
答案 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'替换为任何通用矩阵。