我有两个矩阵X and Y
,两个都是mxn
。我想创建一个订单为mxm
的新矩阵O,以便通过将函数应用于i,j th
和ith
行来计算此新矩阵中的每个jth
条目。分别为1}}和X
。就我而言Y
和m = 10000
。我尝试使用循环但它需要永远。有没有一种有效的方法呢?
我定位的是两个函数点积 - n = 500
和dot(row_i, row_j)
。但我想知道是否有一般的方法,以便我可以插入任何功能。
答案 0 :(得分:4)
解决方案#1
对于第一种情况,看起来你可以在转置Y
之后简单地使用矩阵乘法 -
X*Y'
如果您正在处理复数 -
conj(X*ctranspose(Y))
解决方案#2
对于第二种情况,您需要做更多的工作。您需要将bsxfun
与permute
一起使用来重新排列维度并使用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。
总之,对于ith
和jth
行的X,每个函数都没有一种常用的最有效的方法。如果你仍然坚持这一点,你可以使用anonymous function handles与bsxfun
,但我担心这不是最有效的技术。
答案 1 :(得分:4)
对于第二部分,您还可以使用pdist2
:
result = exp(-pdist2(X,Y));