我有一个函数f
,它使用2个具有相同行数的矩阵并获得标量值。我现在正在寻找创建一个新函数的可能性,该函数需要两个矩阵列表并为所有对调用f
。
我需要一个有效的实现这个循环:
% X = cell of matrices
% Y = cell of matrices
for k=1:length(X)
for l=1:length(Y)
M(k,l) = f(X{k},Y{l});
end
end
(不要求X和Y是细胞)
例如f
可以是平方距离的平均值
f = @(X,Y) mean(mean(bsxfun(@plus,dot(X,X,1)',dot(Y,Y,1))-2*(X'*Y)));
但不要问f
,这只是一个更复杂问题的例子。
答案 0 :(得分:5)
首先,您应该预先分配M
。然后,您可以使用meshgrid
生成X和Y中所有元素对的列表,从而非常容易地切出一个循环:
[K, L] = meshgrid(1:length(X), 1:length(Y));
M = zeros(size(K)); %//This preallocation alone should give you a significant speed up
for ii = 1:numel(K)
M(ii) = f(X{K(ii)},Y{L(ii)});
end
但是,如果你可以实现f
以便它被正确地矢量化,你可能能够传递两个3D矩阵,即X和Y对的整个列表,并且完全没有循环。但这完全取决于你f
的作用。
答案 1 :(得分:0)
可行的解决方案是使用cellfun
fy = @(x,Y) cellfun(@(y) f(x,y), Y);
fx = @(X,Y) cellfun(@(x) fy(x,Y), X, 'UniformOutput', false);
newF = @(X,Y) cell2mat(fx(X,Y)')';
但是我认为有更好的方法可以做到这一点。