我正在用Matlab硬编码一个用于拉伸测试分析的GUI。
当调用图形用户界面时,Results结构包含分析的所有结果,我希望用分析过程中创建的所有数据(应力-应变曲线、尺寸等)来存储.mat文件。
Results.whatever是在GUI启动为nan并在回调中设置适当值时声明的。当我做一个错误,它只是附加新的Results.whtever值,没有抛出任何错误,警告,任何.
有没有办法,如何:
Results.whtever=1抛出一个错误,而Results.whatever=1不抛出一个错误。foo(Results.whtever,1)抛出一个错误,而foo(Results.whatever,1)不抛出错误。编辑:代码片段
% GUI initiation (declaring nested variables)
function=runGUI
% code
Results.Rpt=nan;
% another code
% Callback using nested variables Results and DataArray
function PushFoo
% more code
RP=find(DataArray(:,11)>0.2,1,'first');
Results.RPt=round(DataArray(RP,9));
% yet another code
end
end切入片段;它看起来不像一个问题,但是随着请求的增加,代码变得越来越长。
发布于 2017-04-19 16:32:35
set抛出一个错误,它不是为struct数据类型定义的。如果这是一个指南图形用户界面,那么您的图形用户界面最简单的选择就是将数据保存在图形的guidata中。
Results.whatever = 1;handles.Results =结果;%将其保存在guidata中(hObject,句柄)
或者,您可以将其存储在图形的UserData属性中。
%gcbf= get(gcbf,'UserData');%更改值Results.whatever = 1;%保存它再次设置(gcbf,'UserData',结果)handle类,而不是通过引用传递的struct。我编写了structobj,它本质上创建了一个行为类似于struct的handle类。发布于 2017-04-19 16:59:41
虽然我认为苏弗的回答的#3最适合通用的“结果”数据结构,但另一种方法可以是自定义数据类:
classdef crowleydata < handle
properties
aproperty
anotherproperty
end
methods
function myObj = crowleydata(myObj)
if nargout == 0
% No instance if an output variable isn't specified
clear myObj;
end
end
end
end它可以用GUI初始化实例化,并将所有想要的数据存储为类的属性:
>> results = crowleydata();
>> results.aproperty = 2
results =
crowleydata with properties:
aproperty: 2
anotherproperty: []
>> results.thing = 5
No public property thing exists for class testcode.这种方法的优点是您可以在任何设置中使用特定于您的数据的创建方法,比如GUI可以调用的绘图例程,而不是将行为硬编码到GUI本身。
如果要稍微更改properties块,此方法还允许类型强制执行:
properties
aproperty@double % Undocumented syntax, works >= R2012a (and probably older)
anotherproperty double % Documented syntax introduced in R2016a
end我们可以得到以下信息:
>> a = crowleydata();
>> a.aproperty = 2
a =
crowleydata with properties:
aproperty: 2
anotherproperty: []
>> a.aproperty = 'hi'
Error setting property 'aproperty' of class 'crowlydata':
Value must be 'double'.https://stackoverflow.com/questions/43501288
复制相似问题