【问题标题】:create matrix with row length L from 1D vector从一维向量创建行长 L 的矩阵
【发布时间】:2013-03-22 17:18:15
【问题描述】:

假设我们有以下一维数组

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 是输入一维向量,n 是长度(b),L 是矩阵行长度,但是当我运行此代码时,出现以下错误

??? Undefined function or variable "x".

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

可能是matlab中二维数组的声明错误,还是别的什么?其实我知道实现起来很简单,但是我自己做不到,请帮忙

【问题讨论】:

    标签: matlab matrix vectorization


    【解决方案1】:

    代码:

    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
    

    【讨论】:

    • aa 是的,因为我们改变 l,m 会改变是的,我明白了
    • @dato 同样,更有效的实现可能是将列分配给 x 而不是我上面的行。这是因为 MATLAB 是列专业的。
    • 是的,我需要它,不管是行主要顺序还是列主要顺序,重要的是它应该是非正方形的奇异值分解。非常感谢
    【解决方案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)))
    

    【讨论】:

    • 如果x 是一个随机向量,我不确定这种方法是否有效。
    • 我认为会的,因为bsxfun 解决方案是针对x 的索引,所以对于x 只需执行`x(bsxfun(@...) )
    猜你喜欢
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2021-08-08
    • 2016-01-16
    相关资源
    最近更新 更多