Ошибка классификации переменной при сохранении структуры в parfor - PullRequest
0 голосов
/ 08 октября 2019

У меня есть функция, которая запускает цикл parfor. Внутри цикла я вызываю другую функцию, которая в результате генерирует структуру. Мне нужно сохранить все структуры.

function myFunction(arguments)
    % do some preliminary calcultions
    parfor i = 1:num_sim % number of simulations
        name = sprintf('result_%i',i)
        % do some calculations and generate a structure as a result called "struct_result"
        total_results.(name) = struct_result
    end
end

Это дает мне сообщение об ошибке:

Переменная total_results в parfor не может быть классифицирована.

Как я могу сохранить структуру struct_result из всех симуляций? Это вложенная структура.

1 Ответ

0 голосов
/ 08 октября 2019

Проблема здесь в том, что вы присваиваете часть total_results во время цикла, но не «нарезанным» способом. Вероятно, проще собрать имена и значения отдельно, а затем использовать cell2struct после цикла parfor, например:

N = 10;
names = cell(1, N);
results = cell(1, N);
parfor i = 1:10
    name = sprintf('result_%i',i)
    names{i} = name;
    results{i} = struct('a', rand(i), 'b', rand(i));
end
total_results = cell2struct(results, names, 2);

EDIT Другой способ нарезки выходных данных (как это предлагается в комментариях) заключается в использовании

parfor i = 1:10
    total_results(i).result = struct('a', rand(i), 'b', rand(i));
end

. В этом случае это работает, поскольку индексное выражение первого уровня представляет собой «нарезанное» выражение.

...