Есть ли оператор нарезки для структур Matlab (Octave), чтобы преобразовать их в массив или вектор скаляров и обратно? - PullRequest
0 голосов
/ 29 ноября 2011

В Matlab или GNU Octave я хотел бы сделать что-то вроде этого:

x=struct('a',1,'b',2,'c',[1 2;3 4])
y=x(:) % array-ification of a struct
save -ascii y.txt y
z=load('y.txt')
x(:)=z % struct-ification of an array 

Я хочу сериализовать / выбрать структуру и воссоздать ее позже, позволяя легко читать / сохранять / манипулировать на других языках,Я бы предпочел, чтобы промежуточной формой был текст ascii, а не двоичный, чтобы облегчить чтение / редактирование / отладку человеком.

Я забыл некоторые умные (:) - например, нарезки для структур или массивов ячеек?

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

Я думаю, что вы хотите что-то вроде:

x = struct('a', 1, 'b', 2, 'c', [1 2; 3 4])
save('y.txt', '-struct', 'x', '-ascii')

Но я не думаю, что вы можете легко восстановить его из результирующего файла: происходит потеря данных (имена полей теряются).Если вы не используете опцию -ascii, ее можно полностью восстановить, используя:

save('y.mat', '-struct', 'x')
y = load('y.mat')
isequal(x, y) % returns true

Кроме того, загрузка может загружать только прямоугольный массив чисел текста ASCII (см. http://www.mathworks.com/help/techdoc/ref/save.html и http://www.mathworks.com/help/techdoc/ref/load.html за ограничения).Если вы хотите сохранить поля структуры в вашей сериализованной форме, вы можете обратиться к функции "fieldnames".

1 голос
/ 29 ноября 2011

Да, есть :),

x=struct('a',1,'b',2,'c',[1 2;3 4])
y=reshape([fieldnames(x) struct2cell(x)]',1,[]) % array-ification of a struct

z=struct(y{:}) % struct-ification of an array 

y =

'a' [1] 'b' [2] 'c' [2x2 double]

z =

a: 1

b: 2

c: [2x2 double]

...