Отображать поля структуры без беспорядка
У меня есть структура в Octave, которая содержит некоторые большие массивы.
Я хотел бы знать имена полей в этой структуре, не глядя на все эти большие массивы.
Например, если у меня есть:
x.a=1;
x.b=rand(3);
x.c=1;
Очевидный способ взять gander в структуре выглядит следующим образом:
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's) внутри Octave?
Спасибо!
Ответы
Ответ 1
Возможно, вы захотите взглянуть на Основное использование и примеры. Там было упомянуто несколько функций, которые звучат так, как будто они будут контролировать отображение в терминале.
-
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.
Ответ 2
Используйте 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
Ответ 3
в 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
.