Matlab:将一个向量与许多其他向量进行卷积或相关

时间:2013-03-28 23:18:06

标签: matlab correlation convolution

我有矢量y,矢量x1,x2,...,x50。我需要将y与每个x向量相关或卷积。我目前正在FOR循环中执行此操作,但它很慢,我正试图找到一种方法立即执行它们。 This help page有一个与多个频道相关的部分(这似乎就像我需要做的那样),但只涉及自相关。我已经尝试使用带有向量和矩阵的xcorr函数(矩阵是x向量并排),但这不起作用。任何提示?

谢谢。

2 个答案:

答案 0 :(得分:0)

请勿使用,放慢!

如果您的矢量存储在单元格数组中,则可以使用cellfun

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

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

res现在是一个具有相关性的单元格数组。

这应该比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.

所以它确实更慢。

答案 1 :(得分: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)

如果你对'完整'卷积而不是'相同'感兴趣,请删除最后一行。