我有一个数组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)
。有人可以帮助我如何以矢量化方式接近吗?
答案 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,[]))
上面的代码获取所有必需元素,重新整形为一列然后求和
为所有ii
,jj
,kk
,ll
,mm
组合生成值
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