从1D向量创建行长度为L的矩阵

时间:2013-03-22 17:18:15

标签: matlab matrix vectorization

假设我们有以下1D数组

x(1),x(2),......x(n)

其中n是样本的长度,并且假设我们想要使用以下规则从这些元素创建矩阵,使用一些参数L,我们的二维数组由以下元素组成

(1 row) x(1),x(2),.....x(l)
(2 row)  x(2),x(3),.....x(l+1)
(3 row) x(3),x(4),.......x(l+2)
.
.
.
.(m row)  x(m),x(m+1).... x(n)

我试过以下代码

function [ x ]=create_matrix(b,n,L)
for i=1:n/2 
    x(i,end)=b(i:L);
end;

其中b是输入1D向量,n是长度(b),L是矩阵行长度,但是当我运行此代码时,我得到以下错误

??? Undefined function or variable "x".

Error in ==> create_matrix at 4
    x(i,end)=b(i:L);

也许在matlab中的二维数组声明是错误的,或其他什么?实际上我知道它实现起来非常简单,但我自己也不能,请帮助

2 个答案:

答案 0 :(得分:2)

代码:

function [ x ]=create_matrix(b,l)
    n = length(b);
    m = n-l+1;
    x = zeros(m,l);
    for i=1:m
        x(i,:)=b(i:i+l-1);
    end;
end

示例:

EDU>> create_matrix(1:10,4)

ans =

     1     2     3     4
     2     3     4     5
     3     4     5     6
     4     5     6     7
     5     6     7     8
     6     7     8     9
     7     8     9    10

此外,该矩阵是翻转的toeplitz矩阵。因此可以通过以下方式实现同​​样的目标:

fliplr(toeplitz(4:10,4:-1:1))

输出:

ans =

     1     2     3     4
     2     3     4     5
     3     4     5     6
     4     5     6     7
     5     6     7     8
     6     7     8     9
     7     8     9    10

答案 1 :(得分:2)

另一种选择(可能性能更快)是使用bsxfun,例如

m=7;
l=4;
bsxfun(@plus,[1:m]',0:l-1)

ans =
 1     2     3     4
 2     3     4     5
 3     4     5     6
 4     5     6     7
 5     6     7     8
 6     7     8     9
 7     8     9    10

或通用向量x使用

x(bsxfun(@plus,x(1:m)',0:x(l-1)))