Показвайте структурни полета без бъркотия

Имам структура в Octave, която съдържа някои големи масиви.

Бих искал да знам имената на полетата в тази структура, без да се налага да разглеждам всички тези големи масиви.

Например, ако имам:

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

Очевидният начин да разгледате структурата е следният:

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

В Matlab това ще изглежда като по-сбито:

 >> x
 x = 
    a: 1
    b: [3x3 double]
    c: 1

Как мога да видя полетата/имената на полетата, без да виждам всички тези големи масиви?

Има ли начин да се покаже кратък преглед (като този на Matlab) в Octave?

Благодаря!


person Richard    schedule 22.11.2012    source източник


Отговори (3)


Може да искате да разгледате Основно използване и Примери. Има няколко споменати функции, които звучат така, сякаш ще контролират показването в терминала.

  • struct_levels_to_print
  • print_struct_array_contents

Тези две функции звучат така, сякаш правят това, което искате. Пробвах и двете и не успях да накарам втората да работи. Първата функция промени изхода на терминала така:

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
}

Използвам по-стара версия на Octave.

octave:8> version
ans = 3.2.4

Ако имам възможност, ще проверя тази друга функция, print_struct_array_contents, за да видя дали прави това, което искате. Octave 3.6.2 изглежда най-новата версия към 11/2012.

person slm    schedule 22.11.2012
comment
Благодаря, Сим, това беше почти това, което търсех. Жалко, че не отпечатва рекурсивно само имената на полетата, но това е доста прилично. - person Richard; 22.11.2012
comment
Опитах функцията print_struct_array_contents на v3.6.2 и тя не направи това, което очаквах, така че освен ако някой друг няма по-добра идея, мисля, че това може да е най-добрият ви вариант. - person slm; 22.11.2012

Използвайте 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
}

Или искате да е рекурсивен, добавете следното към вашия .octaverc файл (може да искате да го коригирате според вашите предпочитания)

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

След това можете да го използвате по следния начин:

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
person carandraug    schedule 22.11.2012

в Octave, версия 4.0.0, конфигурирана за "x86_64-pc-linux-gnu".(Ubuntu 16.04) Направих това на командния ред:

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

Изход: (съкратено):

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    
        } 

За деактивиране/връщане към старото поведение

print_struct_array_contents(false)
sampleFactorList
sampleFactorList =

  scalar structure containing the fields:

    sampleFactorList =

      1x6 struct array containing the fields:

        var
        card
        val

Поставих това print_struct_array_contents(true) също във файла .octaverc.

person knb    schedule 20.06.2017