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

Matlab 从1D向量创建行长为L的矩阵,matlab,matrix,vectorization,Matlab,Matrix,Vectorization,假设我们有以下一维数组 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_

假设我们有以下一维数组

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中二维数组的声明有问题,或者是其他什么问题?其实我知道实现起来很简单,但我自己做不到,请帮助代码:

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
代码:

例如:

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
另一个选项(性能可能更快)是使用
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)))
另一个选项(性能可能更快)是使用
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)))

是的,因为我们改变了很多l,m也会改变是的,我see@dato另外,一个更有效的实现可能是将列分配给x,而不是像我上面所说的那样将行分配给x。这是因为MATLAB是列主函数。是的,我需要它,不管它是行主函数还是列主函数,重要的是它对于奇异值分解应该是非平方的。非常感谢。是的,因为我们改变l的越多,m就会改变是的see@dato也,一个更有效的实现可能是将列分配给x,而不是像我上面所说的那样将行分配给x。这是因为MATLAB是列主要的。是的,我需要它,不管它是行主要顺序还是列主要顺序,重要的是对于奇异值分解,它应该是非平方的。非常感谢x是一个随机向量,我不确定这个方法是否有效。我想它会,因为
bsxfun
解决方案是针对
x
的索引,所以对于
x
只需执行`x(bsxfun(@…)如果
x
是一个随机向量,我不确定这个方法是否有效。我认为它会起作用,因为
bsxfun
解决方案是针对
x
的索引,所以对于
x
只需执行`x(bsxfun(@…)