Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 在两个4-D矩阵的矩阵对上应用函数_Matlab_Matrix_Multidimensional Array_Vectorization - Fatal编程技术网

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)));