将像元转换为4D数组

时间:2019-06-26 02:27:46

标签: arrays matlab multidimensional-array reshape cell-array

我的数据以某种形式出现,但我需要另一种形式。我已经尝试过reshapepermute,但是没有达到期望的结果。

输入:

A = {5 x 1}个单元格数组,其中每个单元格均为{300 x 18 single}

预期输出:

大小为18 x 300 x 1 x5的4D数组:

A( 1,  1,1,1) = 0.5
A( 1,  2,1,1) = 0.7
....
A( 1,300,1,1) = 0.8
...
A(18,300,1,1) = 0.99
...
...
...
A(18,300,1,5) = 0.89

(上面的值是随机的)

这是我的尝试,

z = cellfun(@(X) permute(X,[3 2 1]),A,'UniformOutput',false);

导致了

z =
  5×1 cell array
    {1×18×300 single}
    {1×18×300 single}
    {1×18×300 single}
    {1×18×300 single}
    {1×18×300 single}

2 个答案:

答案 0 :(得分:2)

我认为permutereshape 的发展之路。这是我的处理方式:

function z = q56764340(A)
if ~nargin
  %% Generate some data:
  A = reshape(num2cell(zeros(300,18,5,'single'), [1,2]),[], 1);
  %{
  A =
    5×1 cell array
      {300×18 single}
      {300×18 single}
      {300×18 single}
      {300×18 single}
      {300×18 single}
  %}
end

%% Convert to a 4d numeric array:
z = permute( ...                  this does 300x18x1x5 -> 18x300x1x5
      cell2mat( ...               this does 1x1x1x5 -> 300x18x1x5
        reshape(A,1,1,1,[])), ... this does 5x1 -> 1x1x1x5
      [2,1,3,4]);

答案 1 :(得分:1)

您只需要提取每个单元格中的transpose

z = cellfun(@transpose, A, 'un', 0); 

您要寻找的是每个单元中的2D阵列。 18x300和18x300x1x1之间没有区别。每个数组都有无限的单例维度。


修改:
您似乎正在寻找尺寸为18x300x1x5的4D阵列。在这种情况下,请进一步使用:

z = cat(4, z{:});

第3维为1似乎在这里没有任何作用。最好使用尺寸为18x300x5的3D阵列。

z = cat(3, z{:});