Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB:在两个矩阵上应用函数的有效(矢量化)方法?_Matlab_Matrix_Vectorization - Fatal编程技术网

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

MATLAB:在两个矩阵上应用函数的有效(矢量化)方法?,matlab,matrix,vectorization,Matlab,Matrix,Vectorization,我有两个矩阵X和Y,都是顺序mxn。我想创建一个顺序为mxm的新矩阵O,这样新矩阵中的每个I,j th条目分别通过对X和Y的ith和jth行应用函数来计算。在我的例子中,m=10000和n=500。我试着使用一个循环,但它需要永远。有没有一种有效的方法 我的目标是两个功能点产品--dot(row_I,row_j)和exp(-1*norm(row_I-row_j))。但是我想知道是否有一种通用的方法可以插入任何函数。解决方案#1 对于第一种情况,看起来您可以在转置Y后简单地使用矩阵乘法- X*Y'

我有两个矩阵
X和Y
,都是顺序
mxn
。我想创建一个顺序为
mxm
的新矩阵O,这样新矩阵中的每个
I,j th
条目分别通过对
X
Y
ith和
jth
行应用函数来计算。在我的例子中,
m=10000
n=500
。我试着使用一个循环,但它需要永远。有没有一种有效的方法

我的目标是两个功能点产品--
dot(row_I,row_j)
exp(-1*norm(row_I-row_j))
。但是我想知道是否有一种通用的方法可以插入任何函数。

解决方案#1

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

X*Y'
如果你在处理复杂的数字-

conj(X*ctranspose(Y))
解决方案#2

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

squeeze(exp(-1*sqrt(sum(bsxfun(@minus,X,permute(Y,[3 2 1])).^2,2)))
如果要避免挤压,可以使用两个
排列
-

exp(-1*sqrt(sum(bsxfun(@minus,permute(X,[1 3 2]),permute(Y,[3 1 2])).^2,3)))
我还建议你调查这个问题-



总之,没有一种通用的最有效的方法可以用于每个函数对X的第I行和第j行进行


我觉得我可以使用bsxfun,但我不明白这些参数是什么。我发现这很接近,但不起作用。你能解释一下匿名函数句柄部分吗。。对不起,我是MATLAB的新手。我实际上尝试过定义函数,比如dotFun=@(x,y)dot(x,y);并在K=bsxfun(@(i,j)(dotFun(X(i,:),X(j,:)),1:m,(1:m)’)中使用了它;但是得到了误差不相等的维数A,B你会很有兴趣看到你可能得到的加速@Divakar我是说
是对的!点积有一个conjugate@Bob我认为这可以帮助您使用bsxfun部分的匿名函数。还有,你会处理复杂的数字吗?实数-还没有。但我想将来有一天会有人需要:)这正好解决了问题的第二部分。感谢
result = exp(-pdist2(X,Y));