2014-10-04 65 views
2

我有两个矩阵X and Y,都是订购mxn。我想要创建一个新的mxm的矩阵O,使得这个新矩阵中的每个i,j th条目分别通过分别应用ithjth行的函数XY来计算。在我的情况下m = 10000n = 500。我尝试使用循环,但它需要永远。有没有一种有效的方法来做到这一点?MATLAB:在两个矩阵上应用函数的高效(向量化)方法?

我针对两个函数点积 - dot(row_i, row_j)exp(-1*norm(row_i-row_j))。但我想知道是否有一种通用的方法,以便我可以插入任何功能。

+0

我有感觉,我可以使用bsxfun,但我不明白的论点是什么。我发现这个http://stackoverflow.com/questions/9813554/apply-function-to-every-pair-of-columns-in-two-matrices-in-matlab这是接近,但没有奏效。 – Bob 2014-10-04 12:48:13

回答

4

解决方案#1

对于第一种情况,它看起来像你可以简单地使用矩阵乘法调换Y后 -

X*Y' 

如果您在处理复杂的数字 -

conj(X*ctranspose(Y)) 

解决方案#2

对于第二种情况,您需要做更多的工作。您需要使用bsxfunpermute重新安排的尺寸和使用norm计算的原始形式,最后squeeze得到一个二维数组输出 -

squeeze(exp(-1*sqrt(sum(bsxfun(@minus,X,permute(Y,[3 2 1])).^2,2))) 

如果你想避免squeeze,您可以使用两个permute的 -

exp(-1*sqrt(sum(bsxfun(@minus,permute(X,[1 3 2]),permute(Y,[3 1 2])).^2,3))) 

我还建议你看看这个问题 - Efficiently compute pairwise squared Euclidean distance in Matlab


总之,没有如果仍然一意孤行对可能被用于每一个功能ithjth行X的一个共同的最有效的方式,你可以使用anonymous function handlesbsxfun,但恐怕它不会是最有效的技术。

+0

能否请你解释匿名函数处理部分..对不起,我是MATLAB的新手。我实际上试过定义funcs,比如dotFun = @(x,y)dot(x,y);并且在K = bsxfun(@(i,j)(dotFun(X(i,:),X(j,:))),1:m,(1:m)');但得到错误不等维A,B – Bob 2014-10-04 13:21:38

+0

看到你可能获得的这些加速可能会很有趣! – Divakar 2014-10-04 13:21:41

+0

+1在这种情况下,共轭转置是为了 – 2014-10-04 13:21:45

4

对于第二部分中,您还可以使用pdist2

result = exp(-pdist2(X,Y)); 
+0

这恰好解决了问题的第二部分。谢谢! – Bob 2014-10-04 15:14:47

相关问题