Matlab: загрузка файла .mat, почему это структура?можно просто сохранить сохраненные переменные в память? - PullRequest
8 голосов
/ 18 января 2011

Соответствующий код:

function result = loadStructFromFile(fileName, environmentName) 
    result = load(fileName, environmentName);


bigMatrix = loadStructFromFile('values.mat','bigMatrix'); 

Но когда я смотрю в рабочее пространство, он показывает «bigMatrix» как структуру 1x1.Однако, когда я нажимаю на структуру, это фактические данные (в данном случае матрица 998x294).

Ответы [ 3 ]

9 голосов
/ 18 января 2011

Как указано в документации LOAD , если вы вызываете его с выходным аргументом, результат возвращается в структуре.Если вы не вызываете его с выходным аргументом, переменные создаются в локальной рабочей области с именем, под которым они были сохранены.

Для вашей функции loadStructFromFile, если имя сохраненной переменной может иметь разные имена(Я предполагаю environmentName), вы можете вернуть переменную, написав

function result = loadStructFromFile(fileName, environmentName) 
    tmp = load(fileName, environmentName);
    result = tmp.(environmentName); 
3 голосов
/ 18 января 2011

Даже когда вы просто указываете одно имя переменной, LOAD все равно будет выводить его в структуре.В вашем случае вы можете использовать функцию STRUCT2CELL , чтобы преобразовать выходные данные из LOAD в массив ячеек, а затем вернуть этот результат, используя список переменных выходных аргументов .:

function varargout = loadStructFromFile(fileName,environmentName)
  varargout = struct2cell(load(fileName,environmentName));
end

Использование VARARGOUT имеет дополнительное преимущество: если environmentName совпадает с несколькими переменными в файле .MAT, вы можете вернуть их все из своей функции.Например, если ваш файл .MAT имеет три переменные N1, N2 и N3, а environmentName равен N*, вы можете получить их все, вызвав свои функции с несколькими выходами:

[N1,N2,N3] = loadStructFromFile('values.mat','N*');
1 голос
/ 01 февраля 2018

Это старый пост, но если он может быть полезен для некоторых людей:

Когда вы загружаете структуру и хотите напрямую назначить подполя в структуре вывода, вы можете использовать structfunи следующая команда:

bigMatrixOUT = structfun(@(x) x,load('values.mat','bigMatrix'))

bigMatrixOUT будет содержать непосредственно поля bigMatrix, а не bigMatrixOUT.bigMatrix

...