在两个4-D矩阵的

时间:2015-05-19 17:33:26

标签: matlab matrix multidimensional-array vectorization

我有一个函数,它接受两个数组并返回一个名为mad的标量,我有两个矩阵4-D,其中M(:,:,i,j)代表一个块矩阵中的一个块,我想应用{{ 1}}在madM1(:,:,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)); 会起作用,但它比MATLAB中的arrayfun慢,甚至更慢,我希望矢量代码不是for-loop。

我是matlab的初学者,我知道for-loop但是这个函数只使用两个参数的函数,虽然mad只有两个参数,显然bsxfun有四个。

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

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

@(i,j,k,l)

尝试过,没有用,我得到了

  

索引A(I)2超出界限1.

那该怎么办?

PS

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)]); M1(:,:,i,j)的大小相同M2(:,:,k,l)(又名i,j,k,lsize(M1(:,:,i,j))==size(M2(:,:,k,l))不必等于size(M1)

修改

size(M2)函数只执行mad

1 个答案:

答案 0 :(得分:0)

使用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矩阵的每个2D切片是通过将M2的2D切片与M1(4D矩阵)的每个2D切片进行比较而获得的。 out的列长度应等于M1的第3维的大小。行长度应等于M1的第4维的大小。 out矩阵的第3维和第4维的大小将分别等于M2矩阵的第3维和第4维的大小。

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