将矢量重新排列成矩阵

时间:2014-08-26 14:29:00

标签: matlab vector

在Matlab中我有以下向量:

a = [ 1 2 3 4 5 6 ];

我想构建一个矩阵,每行产生一个1元素的swift。输出矩阵应如下所示:

A =

 1     2     3
 2     3     4
 3     4     5
 4     5     6 

哪种方法最快?请提前告诉你!

4 个答案:

答案 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