【发布时间】: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