Отображать поля структуры без беспорядка

У меня есть структура в 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

Эти две функции звучат так, как будто они делают то, что вы хотите. Я пробовал оба и не мог заставить 2-й работать. Первая функция изменила вывод терминала следующим образом:

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

Используйте 1_

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