我有向量 y 和向量 x1,x2,...,x50。我需要将 y 与每个 x 向量相关或卷积。我目前正在 FOR 循环中执行此操作,但速度很慢,我正在尝试找到一种方法来立即执行这些操作。这个帮助页面有一个关于与多个通道相关的部分(这似乎是我需要做的),但只讨论自相关。我曾尝试将 xcorr 函数与向量和矩阵一起使用(矩阵是并排的 x 向量),但这不起作用。有什么提示吗?
谢谢你。
我有向量 y 和向量 x1,x2,...,x50。我需要将 y 与每个 x 向量相关或卷积。我目前正在 FOR 循环中执行此操作,但速度很慢,我正在尝试找到一种方法来立即执行这些操作。这个帮助页面有一个关于与多个通道相关的部分(这似乎是我需要做的),但只讨论自相关。我曾尝试将 xcorr 函数与向量和矩阵一起使用(矩阵是并排的 x 向量),但这不起作用。有什么提示吗?
谢谢你。
不要使用,慢!
如果您的向量存储在元胞数组中,您可以使用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.
所以它确实更慢。
考虑一个大小为 [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)
如果您对“完整”卷积而不是“相同”感兴趣,请删除最后一行。