2016-01-11 3 views
2

Можно ли сгладить массив произвольно вложенных массивов целых чисел в плоский массив целых чисел в Matlab? Например,сгладить структуру произвольно вложенных массивов целых чисел в плоский массив целых чисел

[[1,2,[3]],4] -> [1,2,3,4] 

Любое руководство будет полезно. Благодарю. Например,

a.c = [5,4]; 
a.b.a=[9]; 
a.b.d=[1,2]; 

a= b: [1x1 struct] 
    c: [5 4] 

В этом случае, мой вывод будет

output= [9,1,2,5,4] 
+0

Ваш пример массив не синтаксис MATLAB (или, если это так, то обе стороны являются идентичными, так 'IsEqual ([[1,2, [3]], 4], [1,2,3,4 ])) 'будет возвращать' true'), так что ответить на это сложно. Можете ли вы привести пример MATLAB? Вероятно, вы можете сделать это с помощью 'reshape' или' (:) ', но правильный ответ будет зависеть от вашего типа данных – Dan

+0

Я его отредактировал. Надеюсь, теперь это ясно. – Chris33

+1

Это совсем другой вопрос. Как алгоритм выбирает порядок между '.c' и' .b', а затем снова между '.a' и' .d'? – Dan

ответ

2

Я думаю, вам придется адаптировать функцию flatten от обмена файлами использовать struct2cell так что-то вроде этого:

function C = flatten_struct(A) 

    A = struct2cell(A); 
    C = []; 
    for i=1:numel(A) 
     if(isstruct(A{i})) 
      C = [C,flatten_struct(A{i})]; 
     else 
      C = [C,A{i}]; 
     end 
    end 

end 

Это приводит к:

a.c = [5,4]; 
a.b.a=[9]; 
a.b.d=[1,2]; 

flatten(a) 

ans = 

    5 4 9 1 2 

Таким образом, заказ в том порядке, в котором вы указали свою структуру, а не в своем примере, который, я полагаю, является алфавитным. Но у вас есть контроль над этим, поэтому это не должно быть проблемой.

+0

Как отмечено здесь, это теряет названия структур. –

+0

@CarlWitthoft, который попросил названия структуры? Желаемый результат - это 1-я матрица удвоений. – Dan

+0

есть другие сообщения здесь и в mathworks, где люди ** делают ** хотят сохранить имена источников. Я не отказываюсь от вашего решения; просто предупреждая других читателей, что есть компромиссы. –

-1

У меня есть предварительный взлом, который работает, но довольно неуклюже. Он спускается рекурсивно, сохраняя имена структур и, распаковывая возвращенную структуру на каждом «уровне». 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