3

ベクトル y とベクトル x1、x2、...、x50 があります。y を各 x ベクトルと相関または畳み込む必要があります。現在、これを FOR ループで実行していますが、遅いので、一度に実行する方法を見つけようとしています。このヘルプページには、複数のチャネルとの相関に関するセクションがあります (これは私が行う必要があるように思えます) が、自己相関についてのみ説明しています。ベクトルと行列 (行列は x ベクトルを並べたもの) で xcorr 関数を使用しようとしましたが、うまくいきません。ヒントはありますか?

ありがとうございました。

4

2 に答える 2

0

サイズ [1000, 50] の行列 X をサイズ [50] のベクトル v で畳み込みたいとします。遅い代わりに:

 Y=zeros(size(X))
 for i=1:1000
      Y(i,:)=conv(X,v,'same')
 end

次のようにすることができます:

 V=convmtx(v, 50);
 Y=X*V
 Y=Y(:,1:50)

「同じ」ではなく「完全な」畳み込みに関心がある場合は、最後の行を削除してください。

于 2013-11-05T10:57:20.810 に答える
0

使用しないでください。遅いです。

ベクトルが cell 配列に格納されている場合は、次を使用できますcellfun

y = [ ... ];
xs = { [ ... ], [ ... ], [ ... ] };

res = cellfun(@(x) xcorr(x,y), xs, 'UniformOutput', false);

resは、相関を含む cell 配列になりました。

ループを解釈する必要がないため、これは for ループ (未テスト) よりも高速です。

を使用して、行列をベクトルのセル配列に変換できますmat2cell

アップデート

テスト済み:

xm = rand(n);
xc = mat2cell(xm, ones(n,1), n);
y  = rand([n 1]);

tic
for i = 1:n
   xcorr(y,xm(i,:)); 
end
toc

tic
cellfun(@(x) xcorr(x,y), xc, 'UniformOutput', false);
toc

為にn = 5000

Elapsed time is 5.713080 seconds.
Elapsed time is 7.003739 seconds.

為にn = 10000

Elapsed time is 15.283524 seconds.
Elapsed time is 18.009520 seconds.

したがって、実際にはさらに遅くなります。

于 2013-03-28T23:44:44.130 に答える