Matlab 在两个4-D矩阵的矩阵对上应用函数
我有一个函数,它接受两个数组并返回一个标量,名为Matlab 在两个4-D矩阵的矩阵对上应用函数,matlab,matrix,multidimensional-array,vectorization,Matlab,Matrix,Multidimensional Array,Vectorization,我有一个函数,它接受两个数组并返回一个标量,名为mad,我有两个矩阵4-D,其中M(:,:,I,j)表示块矩阵中的一个块,我想对M1(:,:,I,j)和M2(:,:,k,l)的每个组合应用mad,让我们进一步解释一下,我想要与此等效的代码: 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可以工作,但速度很慢,甚至比MAT
mad
,我有两个矩阵4-D,其中M(:,:,I,j)
表示块矩阵中的一个块,我想对M1(:,:,I,j)
和M2(:,:,k,l)
的每个组合应用mad
,让我们进一步解释一下,我想要与此等效的代码:
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
还要慢,我希望向量代码不用于循环
我是matlab的初学者,我知道bsxfun
,但是这个函数只使用两个参数的函数,尽管mad只有两个参数,显然@(I,j,k,l)
有四个参数
有一个问题正是我的问题,但答案不起作用,因为OP有单元矩阵,我已经设法获得了4-D矩阵(又名矩阵矩阵),所以我认为我必须有一个比网格更好的解决方案,网格网格对我来说不起作用,因为我的数据会很大(更具体的是图像数据)
最后一件事,我想到使用这样的语法:
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
那怎么办呢
附言
M1(:,:,i,j)
和M2(:,:,k,l)
对于所有i,j,k,l
(又称size(M1(:,:,i,j))==size(M2(:,:,k,l))
大小(M1)不必等于大小(M2)
)
编辑
mad
函数只执行sum(sum(abs(M1-M2))/numel(M1)
使用和
所得结果应为4D矩阵。其中,通过将M2
的2D切片与M1
的每个2D切片(4D矩阵)进行比较,获得out
矩阵的每个2D切片。out
的列长度应等于M1
的第三维尺寸。行长度应等于M1
的第四维大小。您的out
矩阵的第三维和第四维大小将分别等于M2
矩阵的第三维和第四维大小
我建议您尝试一个非常简单的示例,并在对实际尺寸执行之前验证结果。唯一加快速度的方法是优化
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切片进行比较matrix@niceman,你能粗略估计一下你的两个矩阵的大小吗?@SanthanSalai 16*16,4D矩阵将有大约50*50个2D切片
out1 = bsxfun(@minus, M1, permute(M2,[1 2 5 6 3 4]));
out = squeeze(sum(sum(abs(out1)))/numel(M1(:,:,1,1)));