多维数组的自定义子数组

时间:2014-05-30 18:52:04

标签: matlab sampling

我有一个数组A,其大小为[N1 N2 N3 3 3]。数组A可以被视为三维矩形框,对于每个元素,定义了一个大小为[3 3]的数组,在这里我称之为B。换句话说,为域中的每个点定义了大小为B的{​​{1}}。

我正在尝试将矩形框细分为大小为[3 3]的小方块,其中d×d×d为偶数。此外,相邻立方体之间应该有d重叠。例如,让我们说:

50%

通过上面的例子,采样将如下。多维数据集以及第一维A; % size(A) = [14 16 20 3 3]; d = 4; ,即A将包含1:14的以下元素:

A

沿着cube1: 1, 2, 3, 4 cube2: 3, 4, 5, 6 cube3: 5, 6, 7, 8 cube4: 7, 8, 9, 10 cube5: 9, 10,11,12 cube6: 11,12,13,14 的第二维,即A,我们有:

1:16

最后沿着cube1: 1, 2, 3, 4 cube2: 3, 4, 5, 6 cube3: 5, 6, 7, 8 cube4: 7, 8, 9, 10 cube5: 9, 10,11,12 cube6: 11,12,13,14 cube7: 13,14,15,16 的第三维,即A

1:20

现在cube1: 1, 2, 3, 4 cube2: 3, 4, 5, 6 cube3: 5, 6, 7, 8 cube4: 7, 8, 9, 10 cube5: 9, 10,11,12 cube6: 11,12,13,14 cube7: 13,14,15,16 cube8: 15,16,17,18 cube9: 17,18,19,20 的大小为Anew,其每个元素的值将是[6 7 9 3 3]的每个元素在B的所有元素上的总和在每个立方体中。例如,A实际上是:

Anew(1, 4, 9, 1, 1)

或换句话说,A(elements of cube1, elements of cube4, elements of cube9, 1, 1) 。因此:

A(1:4, 7:10, 17:20)

在上面的for循环中,Anew(1, 4, 9, 1, 1) = 0; for i = 1:4 % cube1 along with first dimension uses 1, 2, 3, 4 for j = 7:10 % cube4 along with the second dimension uses 7, 8, 9, 10 for k = 17:20 % cube9 along with the third dimension uses 17, 18, 19, 20 Anew(1, 4, 9, 1, 1) = Anew(1, 4, 9, 1, 1) + A(i, j, k, 1, 1); end end end 在原始域中的A(i, j, k, 1, 1)点处为B(1, 1)。有人可以帮助我如何以矢量化方式接近吗?

1 个答案:

答案 0 :(得分:2)

cube1,2,etc的行可以由2*n-1:2*n+2给出,其中n是行号。这将被存储为匿名函数,以简化后面的代码...

ind = @(n) 2*n-1 : 2*n+2

在问题中对循环进行矢量化,point(ii,jj,kk) B(ll,mm)的值可能的解决方案如下:

sum(reshape(A(ind(ii),ind(jj),ind(kk),ll,mm),1,[]))

上面的代码获取所有必需元素,重新整形为一列然后求和


为所有iijjkkllmm组合生成值

sA=size(A);
nii=sA(1)/2-1; njj=sA(2)/2-1; nkk=sA(3)/2-1; nll=sA(4); nmm=sA(5) %Sizes for grid

[ii,jj,kk,ll,mm]=ndgrid(1:nii,1:njj,1:nkk,1:nll,1:nmm);  %Creates grid

Anew=arrayfun(@(ii,jj,kk,ll,mm)sum(reshape(A(ind(ii),ind(jj),ind(kk),ll,mm),...
      1,[])),ii,jj,kk,ll,mm);                            %Apply function to grid