1

次の1D配列があるとします

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

ここで、n はサンプルの長さです。次の規則を使用して、この要素から構成される行列を作成したいとします。いくつかのパラメーター L を使用して、2 次元配列は次の要素で構成されます。

(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 次元配列の宣言が間違っているか、それとも何か他のものでしょうか?実際には実装が非常に簡単であることは知っていますが、自分ではできませんでした。助けてください

4

2 に答える 2

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)))
于 2013-03-22T18:36:30.323 に答える
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

また、この行列は反転したテプリッツ行列です。したがって、同じことが次の方法で実現できます。

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
于 2013-03-22T17:29:34.347 に答える