Matlab 将任意嵌套整数数组的结构展平为整型数组

Matlab 将任意嵌套整数数组的结构展平为整型数组,matlab,vector,struct,flatten,Matlab,Vector,Struct,Flatten,在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] 我认为您必须调整文件交换的功能才能使用这样的功能: function C = flatten_struct(

在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]

我认为您必须调整文件交换的功能才能使用这样的功能:

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_struct(a)

ans =

    5    4    9    1    2

所以顺序是你声明结构的顺序,而不是你的示例顺序,我认为是字母顺序。但是你可以控制它,所以这应该不会是一个问题。

我有一个初步的技巧,它确实有效,但相当笨拙。它递归下降,保存结构名称,并在每个“级别”解压返回的结构


您的示例数组不是MATLAB语法(或者如果是,则两边都相同,因此
相等([[1,2,3]],4],[1,2,3,4])
将返回
true
),因此很难正确回答这个问题。你能提供一个合适的MATLAB例子吗?您可能可以使用
重塑
(:)
执行此操作,但正确答案取决于您的数据类型我已对其进行了编辑。希望它现在清楚了。这是一个非常不同的问题。算法应该如何决定
.c
.b
之间的顺序,然后再决定
.a
.d
之间的顺序?如上所述,这会丢失结构名称。@CarlWitthoft谁要求结构名称?所需的输出是一个1-d双精度矩阵。这里和mathworks还有其他帖子,人们希望保留源名称。我不是反对你的解决方案;只是警告其他读者,这是一种权衡。@CarlWitthoft,但这与问题或答案无关:/噢,好吧。LABATYD@CrisLuengo谢谢——真的哇:有人读了这本精美的印刷品!:-)
%  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