2012-11-22 5 views
11

Ich habe eine Struktur in Octave, die einige große Arrays enthält.Anzeige struct Felder ohne das Chaos

Ich würde gern die Namen der Felder in dieser Struktur wissen, ohne all diese großen Arrays betrachten zu müssen.

Zum Beispiel, wenn ich habe:

x.a=1; 
x.b=rand(3); 
x.c=1; 

Der offensichtliche Weg, um einen Blick an der Struktur zu nehmen ist wie folgt:

octave:12> x 
x = 

    scalar structure containing the fields: 

    a = 1 
    b = 

     0.7195967 0.9026158 0.8946427 
     0.4647287 0.9561791 0.5932929 
     0.3013618 0.2243270 0.5308220 

    c = 1 

In Matlab, dies als prägnanten erscheinen würde:

Wie kann ich die Felder/Feldnamen sehen, ohne all diese großen Arrays zu sehen?

Gibt es eine Möglichkeit, eine knappe Übersicht (wie Matlabs) in Octave anzuzeigen?

Danke!

Antwort

12

Vielleicht möchten Sie einen Blick auf Basic Usage & Examples werfen. Es gibt mehrere Funktionen, die so klingen, als würden sie die Anzeige im Terminal steuern.

  • struct_levels_to_print
  • print_struct_array_contents

Diese beiden Funktionen klingen wie sie tun sind, was Sie wollen. Ich habe beides versucht und konnte den zweiten nicht zur Arbeit bringen. Die 1. Funktion hat den Klemmenausgang wie folgt geändert:

octave:1> x.a=1; 
octave:2> x.b=rand(3); 
octave:3> x.c=1; 
octave:4> struct_levels_to_print 
ans = 2 
octave:5> x 
x = 
{ 
    a = 1 
    b = 

    0.153420 0.587895 0.290646 
    0.050167 0.381663 0.330054 
    0.026161 0.036876 0.818034 

    c = 1 
} 

octave:6> struct_levels_to_print(0) 
octave:7> x 
x = 
{ 
    1x1 struct array containing the fields: 

    a: 1x1 scalar 
    b: 3x3 matrix 
    c: 1x1 scalar 
} 

Ich habe eine ältere Version von Octave.

octave:8> version 
ans = 3.2.4 

Wenn ich eine Chance bekomme ich diese andere Funktion überprüfen würde, print_struct_array_contents, um zu sehen, ob es das tut, was Sie wollen. Oktave 3.6.2 looks to be the latest version Stand 11/2012.

+0

Danke, Sim, das war ziemlich genau das, was ich gesucht habe. Schade, dass es nicht rekursiv nur die Namen der Felder druckt, aber das ist ziemlich anständig. – Richard

+0

Ich habe die Funktion print_struct_array_contents auf v3.6.2 ausprobiert und es hat nicht das getan, was ich erwartet habe, es sei denn, jemand anderes hat eine bessere Idee. Ich denke, das könnte die beste Option sein. – slm

3

Verwenden fieldnames()

octave:33> x.a = 1; 
octave:34> x.b = rand(3); 
octave:35> x.c = 1; 
octave:36> fieldnames (x) 
ans = 
{ 
    [1,1] = a 
    [2,1] = b 
    [3,1] = c 
} 

Oder Sie möchten, es rekursiv sein, fügen Sie den folgenden Code zu Ihrem .octaverc-Datei (Sie es Ihren Wünschen anpassen möchten, können)

function displayfields (x, indent = "") 
    if (isempty (indent)) 
    printf ("%s: ", inputname (1)) 
    endif 
    if (isstruct (x)) 
    printf ("structure containing the fields:\n"); 
    indent = [indent " "]; 
    nn = fieldnames (x); 
    for ii = 1:numel(nn) 
     if (isstruct (x.(nn{ii}))) 
     printf ("%s %s: ", indent, nn{ii}); 
     displayfields (x.(nn{ii}), indent) 
     else 
     printf ("%s %s\n", indent, nn{ii}) 
     endif 
    endfor 
    else 
    display ("not a structure"); 
    endif 
endfunction 

Sie können dann Verwenden Sie es auf folgende Weise:

octave> x.a=1; 
octave> x.b=rand(3); 
octave> x.c.stuff = {2, 3, 45}; 
octave> x.c.stuff2 = {"some", "other"}; 
octave> x.d=1; 
octave> displayfields (x) 
x: structure containing the fields: 
    a 
    b 
    c: structure containing the fields: 
    stuff 
    stuff2 
    d 
0

in Oktave, Version 4.0.0 con gedacht für "x86_64-pc-linux-gnu". (Ubuntu 16.04) Ich tat dies auf der Kommandozeile:

print_struct_array_contents(true) 
sampleFactorList % example, my nested structure array 

Ausgang: (verkürzt):

sampleFactorList = 

    scalar structure containing the fields: 

    sampleFactorList = 

     1x6 struct array containing the fields: 

     var = 
     { 
      [1,1] = 1 
      [1,2] = 
      2 1 3 
     } 

     card = 
     { 
      [1,1] = 3 
      [1,2] = 
      3 3 3  
     } 

zu deaktivieren/wieder auf das alte Verhalten

print_struct_array_contents(false) 
sampleFactorList 
sampleFactorList = 

    scalar structure containing the fields: 

    sampleFactorList = 

     1x6 struct array containing the fields: 

     var 
     card 
     val 

Ich habe Setzen Sie diese print_struct_array_contents(true) auch in die Datei .octaverc.