MATLAB:在两个矩阵上应用函数的高效(矢量化)方法?

时间:2014-10-04 12:25:56

标签: matlab matrix vectorization

我有两个矩阵X and Y,两个都是mxn。我想创建一个订单为mxm的新矩阵O,以便通过将函数应用于i,j thith行来计算此新矩阵中的每个jth条目。分别为1}}和X。就我而言Ym = 10000。我尝试使用循环但它需要永远。有没有一种有效的方法呢?

我定位的是两个函数点积 - n = 500dot(row_i, row_j)。但我想知道是否有一般的方法,以便我可以插入任何功能。

2 个答案:

答案 0 :(得分:4)

解决方案#1

对于第一种情况,看起来你可以在转置Y之后简单地使用矩阵乘法 -

X*Y'

如果您正在处理复数 -

conj(X*ctranspose(Y))

解决方案#2

对于第二种情况,您需要做更多的工作。您需要将bsxfunpermute一起使用来重新排列维度并使用norm计算的原始形式,最后使用squeeze来获取2D数组输出 -

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,但我担心这不是最有效的技术。

答案 1 :(得分:4)

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

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