【问题标题】:Apply a function to all column pairs between two matrices in Matlab将函数应用于Matlab中两个矩阵之间的所有列对
【发布时间】:2015-02-21 06:09:30
【问题描述】:

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

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

有什么建议吗?提前非常感谢!

【问题讨论】:

  • 您的foo 函数可以接受矩阵还是需要逐列传递?
  • 它只接受两个列向量。
  • 那么在这种情况下,您无论如何都不必循环吗?您是否测试过传入两个 m-by-1-by-n 矩阵并查看它是否有效?您可能需要重新编写函数,以便它可以接受这样的输入
  • @sean_xia 为什么bsxfun 解决方案不适合您?你遇到了什么问题? bsxfun( @(ii,jj) foo(A(:,ii),A(:,jj)), (1:d1)', 1:d2) 不工作?
  • @Shai 这是我尝试过的。首先设置两个测试矩阵n = 1000; d1 = 30; d2 = 100; A = randn(n, d1); B = randn(n, d2)。然后应用您的代码:bsxfun( @(ii,jj) dot(A(:,ii),A(:,jj)), (1:d1)', 1:d2) 给我错误“A 和 B 必须相同大小”。使用我的函数:bsxfun( @(ii,jj) foo(A(:,ii),A(:,jj)), (1:d1)', 1:d2) 时,错误消息是“使用 bsxfun 时出错。无效的输出尺寸”。

标签: matlab


【解决方案1】:

如果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 重塑为您想要的形状

【讨论】:

  • 非常感谢您帮助我。不幸的是,我的 dmax 大约是数千,所以ind = dec2bin(0:2^dmax, dmax) 步骤给了我“程序允许的最大变量大小已超出”。
  • 那么您正在处理超过 10 亿对...如果您在 64 位操作系统上运行 64 位 Matlab 则要多得多。也许您应该在页面中循环?即将你的矩阵分解成更小的矩阵,并在每个更小的位上运行我上面的代码,在你进行时保存?
  • 非常感谢你帮助我,@Dan。 A 有 30 列,B 有 3000 列。所以有 90,000 双。 MATLAB 的corr 函数只需不到 1 秒的时间即可计算出这 90,000 个相关系数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
相关资源
最近更新 更多