Как лучше экспортировать данные из appdesigner для последующего использования
Здравствуйте! Создал приложение в appdesigner. В нем вводятся из графического интерфейса данные и сохраняются внутри приложения в структуре, где поля структуры могут представлять собой строковые переменные, числовые массивы и таблицы. Как лучше всего эти данные экспортировать в файл, чтобы потом его повторно исопользовать в приложении и не вводить все заново? Или чтобы создать несколько вариантов входных данных и загружать нужный?
Экспорт в текстовый файл кажется сомнительным, так как потом нужно будет выделять из него все поля структуры обратно, а они могут иметь разные размеры. Муторно это. Функцию, которая бы экспортировала структуру в матлабе не нашел. Mat-файл отлично подходит, но внутри appdesigner он не может использоваться. Да и потом, даже если это вдруг возможно, нужно чтоб приложение работало без привязки к Matlab, standalone так сказать.
Может что посоветуете?
Комментарии
Странно, что с mat-файлом проблемы, можете показать?
Как вариант: структуры хорошо конвертируются в текст в JSON-формат и обратно, для работы с ним есть jsonencode и jsondecode.
mat-файл считывается в рабочее пространство Matlab, а когда приложение работает без Matlab, то считывать его некуда.
Ну вы же где-то храните переменные в приложении, вот туда и загружайте, это и будет ваше рабочее пространство. Я без демонстрации не могу представить, что тут может пойти не так...
ОК, попробую еще раз, что не получится покажу.
Пока решил вопрос через преобразование в таблицу со строковыми переменными и обратно. Чтение-запись через writetable и readtable. С JSON-форматом дела не имел, надо будет попробовать, спасибо.
Может с мат-файлом я перемудрил чего, попробую еще разок.
При попытке воспользоваться командами save и load выдает ошибки:
Warning: Unable to save App Designer app object. Save not supported for matlab.apps.AppBase objects.Unable to load App Designer app object. Load not supported for matlab.apps.AppBase objects.Я рассчитывал увидеть ваш код, который неправильно работает, и возможно его расположение в приложении.
Вот, например:
properties (Access = private)x1 % Descriptionendproperties (Access = public)x2 % Descriptionend% Callbacks that handle component eventsmethods (Access = private)% Code that executes after component creationfunction startupFcn(app)app.x1 = 1;app.x2 = 2;save test.mat;app.x2 = 3;app.x1 = 4;load test.mat x1 x2;app.EditField.Value = app.x1;app.EditField2.Value = app.x2;endendВ окошке видно, что ничего не загрузилось.
load test.mat x1 x2;можно поменять на
load test.mat app.x1 app.x2;или на
load test.mat;Загрузки все равно нет.
Ага, теперь понятно, вот такой синтаксис сработает, здесь данные из mat-файла записываются в переменную:
Вот в справке есть строчка, в которой говорится, что так можно писать:
Ну и чтобы загруженные данные хранились между вызовами вашей функции, создайте property, как вы уже сделали с иксами:
... или можно хранить данные в поле UserData почти любого ui - элемента, например так:
Ух ты!
Только не понял, как потом из app.mydata извлечь нужные данные. Например, те же x1 и x2?
Обращайтесь к ним, как к полям структуры:
Почему-то не получается.
properties (Access = private)x1; % Descriptionx2 % Descriptiontempdata; % Descriptionend% Callbacks that handle component eventsmethods (Access = private)% Code that executes after component creationfunction startupFcn(app)app.x1 = 1;app.x2 = 2;save test.mat;app.x2 = 3;app.x1 = 4;app.tempdata=load("test.mat", "x1", "x2");app.EditField.Value = app.x1;app.EditField2.Value = app.x2;app.TextArea.Value = string(app.tempdata.x1);endendВыдает
Reference to non-existent field 'x1'.Error in testApp/startupFcn (line 35)app.TextArea.Value = string(app.tempdata.x1);Error in testApp (line 98)runStartupFcn(app, @startupFcn)А если открыть test.mat в Matlab, ничего кроме объекта app внутри нет.
В окошке видно, что переменные не загрузились.
Вы неправильно используете функцию save. Попробуйте посмотреть в справке.
properties (Access = private)x1; % Descriptionx2 % Descriptiontempdata; % Descriptionend% Callbacks that handle component eventsmethods (Access = private)% Code that executes after component creationfunction startupFcn(app)app.x1 = 1;app.x2 = 2;y1 = app.x1;y2 = app.x2;save('myFile.mat','y1','y2');app.x1 = 3; %До загрузкиapp.x2 = 4;y1 = 5;y2 = 6;app.tempdata=load("myFile.mat",'y1','y2');app.x1 = app.tempdata.y1; %После загрузкиapp.x2 = app.tempdata.y2;app.EditField.Value = app.x1;app.EditField2.Value = app.x2;app.TextArea.Value = string(app.tempdata.y1) + " " + string(app.tempdata.y2);endendВот в таком варианте заработало. Только как это понять из справки - неведомо. Ничего про то, что к публичным и частным переменным нельзя обращаться командой
saveя не нашел. Для меня это был логичный вариант.