2013-03-22 119 views
1

假设我们有以下1D阵列创建具有从一维向量行长度L矩阵

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

其中n是样品的长度,假设我们想创建矩阵使用以下规则从该元件包括,使用一些参数L,我们的二维阵​​列包括由以下元素

以下代码

function [ x ]=create_matrix(b,n,L) 
for i=1:n/2 
    x(i,end)=b(i:L); 
end; 
(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) 

我试图

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

??? Undefined function or variable "x". 

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

也许东西在MATLAB二维阵列的错误声明?,还是其他什么东西其实我知道这是很容易实现,但我不能我自己,请大家帮忙

回答

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 
+0

所以米应该有不同的价值吗? – 2013-03-22 17:31:31

+0

aa是的,因为尽可能多我们改变l,m会被改变是的,我也看到 – 2013-03-22 17:33:13

+1

@dato,更有效的实现可能是将列分配给x而不是像上面那样。这是因为MATLAB是专栏。 – Justin 2013-03-22 17:37:16

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))) 
+0

如果'x'是一个随机向量我不是确定这种方法将起作用。 – Justin 2013-03-23 02:48:10

+2

我认为它会,因为'bsxfun'解决方案是为'x'的索引,所以对于'x'只需要'x(bsxfun(@ ...)) – bla 2013-03-23 03:45:43

+0

哇,这很聪明。 – Justin 2013-03-23 04:06:12

相关问题