在Matlab中我有以下向量:
a = [ 1 2 3 4 5 6 ];
我想构建一个矩阵,每行产生一个1元素的swift。输出矩阵应如下所示:
A =
1 2 3
2 3 4
3 4 5
4 5 6
哪种方法最快?请提前告诉你!
答案 0 :(得分:5)
简单的矢量化解决方案:
a = [ 1 2 30 4 15 6 ]
m = 4;
n = 3; %// If you want the last element of a to be the bottom right
%// element of your output then n must equal numel(a)-(m-1)
[r,c] = ndgrid(0:(m-1), 1:n);
a(r+c)
ans =
1 2 30
2 30 4
30 4 15
4 15 6
答案 1 :(得分:2)
使用arrayfun快速回答
A = cell2mat(arrayfun(@(i)(a(:,i:i+2))',1:4,'uni',0))';
更一般地说,如果您想要k
中的a
的第一个A
元素,请使用:(在上面的代码k = 3
中)
A = cell2mat(arrayfun(@(i)(a(:,i:i+k-1))',1:numel(a)-k+1,'uni',0))';
正如Dan指出的那样,这种方法很好,但对于大型矩阵来说并不快;
答案 2 :(得分:1)
使用简单的for循环和circshift
A = zeros(4,3);
for i= 0:3
answer = circshift(a,[0 -i]);
A(i+1,:) = answer(1:3);
end
答案 3 :(得分:0)
虽然这是一个迟到的答案,但您也可以使用hankel
巧妙地执行此操作:
A = [1 2 30 4 15 6];
A = hankel(A(1:4), A(4:6))
A =
1 2 30
2 30 4
30 4 15
4 15 6