评估所有矩阵对

时间:2014-04-29 11:06:22

标签: matlab matrix

我有一个函数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,这只是一个更复杂问题的例子。

2 个答案:

答案 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)')';

但是我认为有更好的方法可以做到这一点。