Есть ли способ конвертировать двойной массив в массив структур? - PullRequest
0 голосов
/ 21 апреля 2020

Есть ли способ преобразовать двойной массив в массив структур и поместить его в одно поле?

Например, предположим, что мы получаем двойной массив из вызова cellfun, и выходной массив выглядит как

data=[1,2;3,4];

Можем ли мы получить struct S, где

S=struct;
for i=1:numel(data)
        S(i).data=data(i);
    end
end

с собственными функциями или просто получить S эффективно? (визуально в конце)

Если есть метод, может ли результирующий массив struct сохранить размеры исходного двойного массива? Может ли метод применяться к выводу cellfun, где вывод представляет собой двойной массив?

В моем конкретном приложении мой data является (равномерным) выводом вызова для cellfun, и когда я устанавливаю S.data=cellfun(...), результатом является структурный массив из 1 элемента, где S.data - двойной массив m-by-n из cellfun(...). Что я могу сделать, чтобы распределить элементы массива?

(Моя задача состоит в том, чтобы обрабатывать 10 тыс. Точек данных на запрос, а для каждой задачи - около 16 запросов. Поэтому важна скорость. Если эффективного метода нет, Я буду знать, чтобы избежать структурирования для этого конкретного типа задач. Так что комментарии на этом фронте тоже полезны.)

enter image description here

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Используйте struct и num2cell:

data = [1,2;3,4];
S = struct ('data', num2cell(data));
0 голосов
/ 21 апреля 2020

Поскольку вы хотите иметь индивидуальное поле для каждого элемента матрицы, я должен сказать: нет, для этого нет стандартного решения. Если вам это совершенно не нужно, я бы не рекомендовал это делать, см. этот пост . Это просто требует больше памяти и немного напрягает при взгляде.

Тем не менее, это возможно, но вы должны начинать каждое имя вашего поля с символа.

data = [1,2;3,4];
% create empty struct
S = struct();
%% create new structure
for i = 1:length(data)
    % create field name (must start with a character!)
    fld = num2str(i,'F%d');
    % write to field (note the brackets)
    S.(fld) = data(i);
end

I В случае, если вы хотите получить доступ к данным с помощью цикла, используйте функцию MATLAB-buildin fieldnames для более общего подхода, чем самостоятельное создание имен полей (и избегайте недостатков, когда вы удаляете одно поле;))

%% access new structure (looping over field names)
% get all field names
FlNms = fieldnames(S);
for i = 1:length(FldNames)
    % access field names (this is a cell!)
    fld = FldNms{i};
    % access struct
    data_element = S.(fld);
    % do something
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...