在Matlab中将函数应用于两个矩阵之间的所有列对

在Matlab中将函数应用于两个矩阵之间的所有列对,matlab,Matlab,我有一个Matlab函数z=foo(x,y),它将两列向量作为输入并输出标量。现在我想将此函数应用于两个矩阵A(维数n*d1)和B(维数n*d2),并生成一个d1*d2矩阵,以便输出(I,j)=foo(A(:,I),B(:,j))。它基本上应该类似于将corr函数应用于两个矩阵的行为 我在中尝试了这些解决方案,但在第一个答案中遇到了相同的问题,第二个解决方案中的meshgrid步骤太慢了 有什么建议吗?非常感谢 如果foo接受矩阵,则: %Find dimensions dA = size(A,

我有一个Matlab函数
z=foo(x,y)
,它将两列向量作为输入并输出标量。现在我想将此函数应用于两个矩阵A(维数n*d1)和B(维数n*d2),并生成一个d1*d2矩阵,以便
输出(I,j)=foo(A(:,I),B(:,j))
。它基本上应该类似于将
corr
函数应用于两个矩阵的行为

我在中尝试了这些解决方案,但在第一个答案中遇到了相同的问题,第二个解决方案中的
meshgrid
步骤太慢了


有什么建议吗?非常感谢

如果
foo
接受矩阵,则:

%Find dimensions
dA = size(A,2);
dB = size(B,2);


%Generate a list of all possible column pairs for the two matrices
indA = ceil((1:dA*dB)/dA);
indB = mod(0:dA*dB, dB)+1;

X = A(:, indA);
Y = B(:, indB);

z = foo(X,Y)

然后您可能能够将
z
重塑为您想要的

您的
foo
函数可以接受一个矩阵还是需要逐个传递每一列?它只接受两个列向量。那么,在这种情况下,您不必在任何情况下循环吗?您是否测试过通过两个m-by-1-by-n矩阵并查看其是否有效?对您来说,重新编写函数以使其能够接受如下输入可能是有意义的this@sean_xia为什么
bsxfun
解决方案不适合您?你遇到了什么问题<代码>bsxfun(@(ii,jj)foo(A(:,ii),A(:,jj)),(1:d1)“,1:d2)不起作用?@Shai这是我尝试过的。首先设置两个测试矩阵
n=1000;d1=30;d2=100;A=随机数n(n,d1);B=randn(n,d2)
。然后应用您的代码:
bsxfun(@(ii,jj)点(A(:,ii),A(:,jj)),(1:d1)”,1:d2)
会给我错误“A和B必须大小相同”。当使用我的函数:
bsxfun(@(ii,jj)foo(A(:,ii),A(:,jj)),(1:d1)”,1:d2)
时,错误消息是“使用bsxfun时出错。输出维度无效”。非常感谢您的帮助。不幸的是,我的dmax大约有数千个,因此
ind=dec2bin(0:2^dmax,dmax)
步骤会告诉我“超过了程序允许的最大变量大小”。因此,您要处理的是超过十亿对。。。如果在64位操作系统上运行64位Matlab,则要多得多。也许你应该在页面中循环?i、 e.将你的矩阵分解成更小的矩阵,并在每个较小的位上运行类似于我上面的代码,边走边保存?非常感谢你的帮助,@Dan。A有30列,B有3000列。所以有90000对。MATLAB的
corr
函数计算这90000个相关系数不到1秒。