【问题标题】:Custom subarray of a multidimensional array多维数组的自定义子数组
【发布时间】:2014-05-30 18:52:03
【问题描述】:

我有一个数组A,其大小为[N1 N2 N3 3 3]。数组A可以看成是一个三个维度的矩形框,每个元素定义一个大小为[3 3]的数组,这里我称之为B。换句话说,为域中的每个点定义了大小为[3 3]B

我正在尝试将矩形框细分为大小为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)。因此:

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

在上面的 for 循环中,A(i, j, k, 1, 1) 在原始域中的点 (i, j, k) 处是 B(1, 1)。有人可以帮助我如何以矢量化方式进行处理吗?

【问题讨论】:

  • 那么对于cube6 在第一个维度中它只有三个元素,而同一维度中的其他立方体有四个?这些立方体不应该是相同大小的吗?
  • @Divakar:请查看我在问题中的更新。现在所有立方体都有保存数量的元素。

标签: matlab sampling


【解决方案1】:

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

【讨论】:

  • 绝对是一种创造性、快速、高效的解决问题的方法。喜欢它!
  • 这是匿名函数的绝妙使用! S0 是学习的地方! +1 当然
  • @Divakar:S0 在哪里?
  • S0 在 [S]tack[O]verflow 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 2017-09-25
  • 2014-08-29
  • 1970-01-01
相关资源
最近更新 更多