3

我有向量 y 和向量 x1,x2,...,x50。我需要将 y 与每个 x 向量相关或卷积。我目前正在 FOR 循环中执行此操作,但速度很慢,我正在尝试找到一种方法来立即执行这些操作。这个帮助页面有一个关于与多个通道相关的部分(这似乎是我需要做的),但只讨论自相关。我曾尝试将 xcorr 函数与向量和矩阵一起使用(矩阵是并排的 x 向量),但这不起作用。有什么提示吗?

谢谢你。

4

2 回答 2

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.

所以它确实更慢。

于 2013-03-28T23:44:44.130 回答
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 回答