Преобразование ячейки в массив 4D - PullRequest
0 голосов
/ 26 июня 2019

Мои данные пришли в определенной форме, но они мне нужны в другой.Я пробовал reshape и permute, но пока не достиг желаемого результата.

Ввод:

A = {5 x 1} массив ячеек, где каждая ячейка {300 x 18 single}.

Ожидаемый результат:

A 4D массивразмером 18 x 300 x 1 x5:

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 ]

2 голосов
/ 26 июня 2019

Я думаю, permute и reshape - это путь . Вот как я это сделаю:

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 голос
/ 26 июня 2019

Вам просто нужно взять транспонировать каждой клетки.

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

Что вы ищете, так это двухмерный массив в каждой ячейке. Разницы между 18x300 и 18x300x1x1 нет. Каждый массив имеет бесконечные одноэлементные размеры.


Edit:
Кажется, вы ищете 4D массив размером 18x300x1x5. В этом случае используйте:

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

Третье измерение как 1, кажется, здесь не служит какой-либо цели. Вместо этого было бы лучше иметь трехмерный массив размером 18x300x5.

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