【问题标题】:Apply function on pair of matrices from two 4-D matrices对来自两个 4-D 矩阵的矩阵对应用函数
【发布时间】:2015-07-31 16:18:56
【问题描述】:

我有一个函数,它接受两个数组并返回一个名为 mad 的标量,我有两个 4-D 矩阵,其中 M(:,:,i,j) 表示块矩阵中的一个块,我想在每个组合上应用 mad M1(:,:,i,j)M2(:,:,k,l),让我们进一步解释一下,我想要与此等效的代码:

arrayfun(@(i,j,k,l) mad(M1(:,:,i,j),M2(:,:,k,l)),1:size(M1,1),1:size(M1,2),1:size(M2,1),1:size(M2,2));

arrayfun 可以工作,但它很慢,甚至比 MATLAB 中的for-loop 还要慢,我想要矢量代码而不是 for-loop。

我是 matlab 的初学者,我知道 bsxfun,但是这个函数可以使用只接受两个参数的函数,虽然 mad 只有两个参数,显然 @(i,j,k,l) 有四个。

有一个问题正是我的问题,即this,但由于 OP 有单元矩阵,所以答案不起作用,我已经设法获得 4-D 矩阵(又名矩阵矩阵),所以我想我必须有比 meshgrid 更好的解决方案,meshgrid 对我不起作用,因为我的数据会很大(图像数据更具体)。

最后一件事,我想到了使用这样的语法:

bsxfun(@(i,j) mad(M1(i(1),1(2)),M2(j(1),j(2))),[1:size(M1,1) 1:size(M1,2)],[1:size(M2,1) 1:size(M2,2)]);

试过了,没用过

索引 A(I) 2 超出范围 1。

那该怎么办?

PS

M1(:,:,i,j)M2(:,:,k,l) 对于所有 i,j,k,l 的大小相同(又名 size(M1(:,:,i,j))==size(M2(:,:,k,l))size(M1) 不必等于 size(M2)

编辑

mad 函数只做sum(sum(abs(M1-M2)))/numel(M1)

【问题讨论】:

  • 加快速度的唯一方法是优化mad 函数本身。否则你就不走运了。
  • 澄清一下,不应该是1:size(M1,3),1:size(M1,4),1:size(M2,3),1:size(M2,4)吗? bsxfun 也不会像 arrayfun 那样工作。在arrayfun 中使用1:size(M1,3)1:size(M1,4) 等将同时迭代两者.. 你确定要这样做吗?还是要将每个 2D 切片与其他 4D 矩阵的每个其他 2D 切片进行比较?
  • @SanthanSalai 我想将每个 2D 切片与其他 4D 矩阵的每个其他 2D 切片进行比较
  • @niceman,你能粗略估计一下你的 2 个矩阵的大小吗?
  • @SanthanSalai 16*16,4D 矩阵将有大约 50*50 2D 切片

标签: matlab matrix multidimensional-array vectorization


【解决方案1】:

使用bsxfunpermute

out1 = bsxfun(@minus, M1, permute(M2,[1 2 5 6 3 4]));

out = squeeze(sum(sum(abs(out1)))/numel(M1(:,:,1,1)));

得到的结果应该是一个4D矩阵。其中out 矩阵的每个二维切片是通过将M2 的二维切片与M1(4D 矩阵)的每个二维切片进行比较而获得的。 out 的列长度应等于M1 的第三维大小。行长应该等于M1 的第四维的大小。 out 矩阵的第 3 维和第 4 维的大小将分别等于 M2 矩阵的第 3 维和第 4 维的大小。

我建议您尝试一个非常简单的示例,并在针对您的实际尺寸执行之前验证结果。

【讨论】:

    猜你喜欢
    • 2019-10-04
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 2018-12-21
    相关资源
    最近更新 更多