📄 nndataimport.m
字号:
set(ud.Handles.InputText,'enable','on');
set(ud.Handles.InputEdit,'enable','on');
set(ud.Handles.InputButton,'enable','on');
set(ud.Handles.OutputText,'enable','on');
set(ud.Handles.OutputEdit,'enable','on');
set(ud.Handles.OutputButton,'enable','on');
set(ud.Handles.DataText,'enable','off');
set(ud.Handles.DataEdit,'enable','off');
set(ud.Handles.DataButton,'enable','off');
else
set(ud.Handles.InputText,'enable','off');
set(ud.Handles.InputEdit,'enable','off');
set(ud.Handles.InputButton,'enable','off');
set(ud.Handles.OutputText,'enable','off');
set(ud.Handles.OutputEdit,'enable','off');
set(ud.Handles.OutputButton,'enable','off');
set(ud.Handles.DataText,'enable','on');
set(ud.Handles.DataEdit,'enable','on');
set(ud.Handles.DataButton,'enable','on');
end
if get(ud.Handles.Wbutton,'Value'),
nncontrolutil('nndataimport','workspace',gcbf);
else
nncontrolutil('nndataimport','matfile',gcbf);
end
elseif strcmp(cmd,'editcallback'),
%---Callback for the Input, Output and Structure Edit boxes
%---These boxes should contain an index into the List Box string
%---The Index should be zero when an invalid name is entered
TryString = get(gcbo,'String');
udEdit = get(gcbo,'UserData');
if isempty(TryString), % empty value, leave it that way
udEdit.ListIndex=0;
udEdit.String='';
else
IndList = strmatch(TryString,ud.ListData.Names,'exact');
if isempty(IndList),
% Revert to last valid entry
if isempty(udEdit.ListIndex),
set(gcbo,'String','');
else
set(gcbo,'String',udEdit.String);
end, %if/else isempty(udEdit)
WarnStr=['You must enter an array or structure from the list box.'];
warndlg(WarnStr,'Import Warning','modal');
else, % Store the list index
udEdit.ListIndex=IndList;
udEdit.String=TryString;
end % if/else isempty(IndList);
end % if/else isempty(TryString);
set(gcbo,'UserData',udEdit);
elseif strcmp(cmd,'matfile'),
set(ud.Handles.ModelText,'string','MAT-file Contents');
set([ud.Handles.FileNameText,...
ud.Handles.FileNameEdit,...
ud.Handles.BrowseButton],'enable','on');
set(ud.Handles.FileNameText,'String','MAT-filename:');
set(ud.Handles.BrowseButton,'Callback','nncontrolutil(''nndataimport'',''browsemat'',gcbf);');
set(ud.Handles.FileNameEdit,...
'Callback','nncontrolutil(''nndataimport'',''clearpath'',gcbf);nncontrolutil(''nndataimport'',''matfile'',gcbf);');
FileName = get(ud.Handles.FileNameEdit,'String');
if isempty(FileName),
Data=struct('Names','','Objects',[]);
else
try
if get(ud.Handles.Abutton,'Value'),
type_data='double';
else
type_data='struct';
end
VAR=load(FileName);
WorkspaceVars=whos('-file',FileName);
sysvar=cell(size(WorkspaceVars));
s=0;
for ct=1:size(WorkspaceVars,1),
VarClass=WorkspaceVars(ct).class;
if (strcmp(VarClass,type_data)) & isequal(2,length(WorkspaceVars(ct).size)) %& ~(strcmp(WorkspaceVars(ct).name,'ud')),
% Only look for structure objects
s=s+1;
sysvar(s)={WorkspaceVars(ct).name};
end % if isa
end % for ct
sysvar=sysvar(1:s);
DataObjects = cell(2,1);
for ctud=1:s,
DataObjects{ctud} = eval(cat(2,'VAR.',sysvar{ctud}));
end % for
Data = struct('Names',{sysvar},'Objects',{DataObjects});
catch
warndlg(lasterr,'Import Warning','modal');
set(ud.Handles.FileNameEdit,'String','');
FileName='';
Data=struct('Names','','Objects',[]);
end % try/catch
end % if/else check on FileName
LocalFinishLoad(fig,ud,FileName,Data)
elseif strcmp(cmd,'workspace')
set(ud.Handles.ModelText,'string','Workspace Contents');
set([ud.Handles.FileNameText,...
ud.Handles.FileNameEdit,...
ud.Handles.BrowseButton],'enable','off');
%----Look for all workspace variables of class 'ss', 'tf', or 'zpk'
WorkspaceVars=evalin('base','whos');
sysvar=cell(size(WorkspaceVars));
s=0;
if get(ud.Handles.Abutton,'Value'),
type_data='double';
else
type_data='struct';
end
for ct=1:size(WorkspaceVars,1),
VarClass=WorkspaceVars(ct).class;
if (strcmp(VarClass,type_data)) & isequal(2,length(WorkspaceVars(ct).size)),
% Only look for Non-array (TF, SS, and ZPK) LTI objects
s=s+1;
sysvar(s,1)={WorkspaceVars(ct).name};
end % if isa
end % for ct
sysvar=sysvar(1:s,1);
DataObjects = cell(s,1);
for ctud=1:s,
DataObjects{ctud} = evalin('base',sysvar{ctud});
end
Data = struct('Names',{sysvar},'Objects',{DataObjects});
set(ud.Handles.ModelList,'String',sysvar,'value',1)
%---Update the Import Figure Userdata
ud.ListData=Data;
set(fig,'UserData',ud);
elseif strcmp(cmd,'browsemat')
filterspec = '*.mat';
udFileEdit = get(ud.Handles.FileNameEdit,'UserData');
LastPath = udFileEdit.PathName;
CurrentPath=pwd;
if ~isempty(LastPath),
cd(LastPath);
end
[filename,pathname] = uigetfile(filterspec,'Import file:');
if ~isempty(LastPath),
cd(CurrentPath);
end
if filename,
if ~strcmpi(pathname(1:end-1),CurrentPath)
ImportStr = [pathname,filename(1:end-4)];
else
ImportStr = filename(1:end-4);
end
set(ud.Handles.FileNameEdit,'String',ImportStr);
nncontrolutil('nndataimport','matfile',fig);
set(ud.Handles.DataEdit,'String','','UserData',...
struct('ListIndex',0,'String',''));
set(ud.Handles.InputEdit,'String','','UserData',...
struct('ListIndex',0,'String',''));
set(ud.Handles.OutputEdit,'String','','UserData',...
struct('ListIndex',0,'String',''));
end
elseif strcmp(cmd,'clearpath') & (fig)
%---Callback for the SImulink File box
% Whenever a new name is entered, update the Userdata
NewName = get(gcbo,'String');
indDot = findstr(NewName,'.');
if ~isempty(indDot),
NewName=NewName(1:indDot(end)-1);
set(ud.Handles.FileNameEdit,'String',NewName)
end
elseif strcmp(cmd,'buttoncallback')
%---Callback for the Arrow Buttons
EditBox = get(gcbo,'UserData');
AllNames = get(ud.Handles.ModelList,'String');
if ~isempty(AllNames), % Make sure these is something in the list
SelectedName = get(ud.Handles.ModelList,'Value');
udEdit = get(EditBox ,'UserData');
udEdit.String = AllNames{SelectedName};
udEdit.ListIndex = SelectedName;
set(EditBox,'String',AllNames{SelectedName},'UserData',udEdit);
end
elseif strcmp(cmd,'apply'), % Send the new Feedback structure to the Parent's Userdata
if get(ud.Handles.Sbutton,'value')
DataOK=0;
%---Data
udDataEdit = get(ud.Handles.DataEdit,'UserData');
if udDataEdit.ListIndex~=0,
ud.ModelData.Data.Name = udDataEdit.String;
ud.ModelData.Data.Object = ...
ud.ListData.Objects{udDataEdit.ListIndex};
if ~isfield(ud.ModelData.Data.Object,'U') | ~isfield(ud.ModelData.Data.Object,'Y')
warndlg('The data structure must at least have fields U and Y for Input and Output arrays.',...
'Import Warning','modal');
return
end
size_U=size(ud.ModelData.Data.Object.U(:),1);
size_Y=size(ud.ModelData.Data.Object.Y(:),1);
if size_U ~= size_Y
warndlg('The Input and Output arrays (U and Y) inside the data structure must have the same dimensions.',...
'Import Warning','modal');
return
end
if isfield(ud.ModelData.Data.Object,'Ts')
H=get(ud.Handles.parent,'userdata');
Ts=str2num(get(H.Sampling_time,'string'));
if Ts~=ud.ModelData.Data.Object.Ts
temp=questdlg({['Your data structure has a different sampling time than the simulink controller block.'] ...
['The simulink controller block will use the sampling time already configured.'] ...
['Do you want to continue ?']},...
'Import Warning','Yes','No','No');
if strcmp(temp,'No')
return
end
end
end
ImportStr=get(ud.Handles.FileNameEdit,'String');
if strcmp(ud.Handles.type_net,'narma_l2') | strcmp(ud.Handles.type_net,'nnpredict') ...
| strcmp(ud.Handles.type_net,'nnmodref')
nnident('have_file',ImportStr,ud.ModelData.Data.Name);
elseif strcmp(ud.Handles.type_net,'ref')
nnmodref('have_file',ImportStr,ud.ModelData.Data.Name);
end
DataOK=1;
end
figure_variables=get(ud.Handles.parent,'userdata');
parent_simulink=get(figure_variables.gcbh_ptr,'userdata');
if DataOK
H=get(ud.Handles.parent,'userdata');
arg1=get(H.gcbh_ptr,'userdata');
arg2=get(H.gcb_ptr,'userdata');
if strcmp('ref',ud.Handles.type_net)
nnmodref('',arg1,arg2,'');
else
nnident('',arg1,arg2,'');
end
delete(fig)
return
end
else
U_OK=0;
Y_OK=0;
%---Data
udInputEdit = get(ud.Handles.InputEdit,'UserData');
udOutputEdit = get(ud.Handles.OutputEdit,'UserData');
if udInputEdit.ListIndex==0 | udOutputEdit.ListIndex==0,
warndlg('You must define the input and output variables to be imported.',...
'Import Warning','modal');
return
end
if udInputEdit.ListIndex~=0 & udOutputEdit.ListIndex~=0,
ud.ModelData.DataU.Name = udInputEdit.String;
ud.ModelData.DataU.Object = ...
ud.ListData.Objects{udInputEdit.ListIndex};
ud.ModelData.DataY.Name = udOutputEdit.String;
ud.ModelData.DataY.Object = ...
ud.ListData.Objects{udOutputEdit.ListIndex};
size_U=size(ud.ModelData.DataU.Object);
size_Y=size(ud.ModelData.DataY.Object);
if (size_U(1)>1 & size_U(2)>1) | (size_Y(1)>1 & size_Y(2)>1)
warndlg('The Input and Output arrays must be row (1xN) or column (Nx1) variables.',...
'Import Warning','modal');
return
end
size_U=size(ud.ModelData.DataU.Object,1);
if size_U<=1
size_U=size(ud.ModelData.DataU.Object,2);
if size_U<=1
warndlg('The Input Array must be empty or have only one element.',...
'Import Warning','modal');
return
end
end
size_Y=size(ud.ModelData.DataY.Object,1);
if size_Y<=1
size_Y=size(ud.ModelData.DataY.Object,2);
if size_Y<=1
warndlg('The Output Array must be empty or have only one element.',...
'Import Warning','modal');
return
end
end
if size_U ~= size_Y
warndlg('The Input and Output arrays must have the same dimensions.',...
'Import Warning','modal');
return
end
ImportStr=get(ud.Handles.FileNameEdit,'String');
if strcmp(ud.Handles.type_net,'narma_l2') | strcmp(ud.Handles.type_net,'nnpredict') ...
| strcmp(ud.Handles.type_net,'nnmodref')
nnident('have_file',ImportStr,ud.ModelData.DataU.Name,ud.ModelData.DataY.Name);
elseif strcmp(ud.Handles.type_net,'ref')
nnmodref('have_file',ImportStr,ud.ModelData.DataU.Name,ud.ModelData.DataY.Name);
end
DataOK=1;
end
figure_variables=get(ud.Handles.parent,'userdata');
parent_simulink=get(figure_variables.gcbh_ptr,'userdata');
if DataOK
H=get(ud.Handles.parent,'userdata');
arg1=get(H.gcbh_ptr,'userdata');
arg2=get(H.gcb_ptr,'userdata');
if strcmp('ref',ud.Handles.type_net)
nnmodref('',arg1,arg2,'');
else
nnident('',arg1,arg2,'');
end
delete(fig)
return
end
end
warndlg('You must define the variables to be imported.',...
'Import Warning','modal');
set(fig,'UserData',ud)
uiresume(fig)
end
%-----------------------------Internal Functions--------------------------
%%%%%%%%%%%%%%%%%%%%%%%
%%% LocalFinishLoad %%%
%%%%%%%%%%%%%%%%%%%%%%%
function LocalFinishLoad(ImportFig,ud,FileName,Data)
%---Update the FileNameEdit Userdata
[P,F]=fileparts(FileName);
udNames = get(ud.Handles.FileNameEdit,'UserData');
udNames.PathName=P;
udNames.FileName=F;
set(ud.Handles.FileNameEdit,'UserData',udNames)
%---Update the Import Figure Userdata
set(ud.Handles.ModelList,'String',Data.Names,'value',1)
ud.ListData=Data;
set(ImportFig,'UserData',ud);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -