У меня есть предварительный взлом, который работает, но довольно неуклюже. Он спускается рекурсивно, сохраняя имена структур и, распаковывая возвращенную структуру на каждом «уровне». Copyright Carl Witthoft по обычным правилам GPL-3.
% struct2sims converter
function simout = struct2sims(structin)
fnam = fieldnames(structin);
for jf = 1:numel(fnam)
subnam = [inputname(1),'_',fnam{jf}];
if isstruct(structin.(fnam{jf})) ,
% need to dive; build a new variable that's not a substruct
eval(sprintf('%s = structin.(fnam{jf});', fnam{jf}));
eval(sprintf('simtmp = struct2sims(%s);',fnam{jf}));
% try removing the struct before getting any farther...
simout.(subnam) = simtmp;
else
% at bottom, ok
simout.(subnam) = structin.(fnam{jf});
end
end
% need to unpack structs here, after each level of recursion
% returns...
subfnam = fieldnames(simout);
for kf = 1:numel(subfnam)
if isstruct(simout.(subfnam{kf})),
subsubnam = fieldnames(simout.(subfnam{kf}));
for fk = 1:numel(subsubnam)
simout.([inputname(1),'_',subsubnam{fk}])...
= simout.(subfnam{kf}).(subsubnam{fk}) ;
end
simout = rmfield(simout,subfnam{kf});
end
end
% if desired write to file with:
% save('flattened','-struct','simout');
end
Ваш пример массив не синтаксис MATLAB (или, если это так, то обе стороны являются идентичными, так 'IsEqual ([[1,2, [3]], 4], [1,2,3,4 ])) 'будет возвращать' true'), так что ответить на это сложно. Можете ли вы привести пример MATLAB? Вероятно, вы можете сделать это с помощью 'reshape' или' (:) ', но правильный ответ будет зависеть от вашего типа данных – Dan
Я его отредактировал. Надеюсь, теперь это ясно. – Chris33
Это совсем другой вопрос. Как алгоритм выбирает порядок между '.c' и' .b', а затем снова между '.a' и' .d'? – Dan