我有矢量y,矢量x1,x2,...,x50。我需要将y与每个x向量相关或卷积。我目前正在FOR循环中执行此操作,但它很慢,我正试图找到一种方法立即执行它们。 This help page有一个与多个频道相关的部分(这似乎就像我需要做的那样),但只涉及自相关。我已经尝试使用带有向量和矩阵的xcorr函数(矩阵是x向量并排),但这不起作用。任何提示?
谢谢。
答案 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)
如果你对'完整'卷积而不是'相同'感兴趣,请删除最后一行。