![]() |
| Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé. | |||||||
|
|||||||
| GUI Forum d'entraide sur les interfaces graphiques en MATLAB |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Nouveau membre du Club
![]() Date d'inscription: juin 2008
Localisation: dijon ( juste a coté de)
Âge: 49
Messages: 51
|
Bonjour a tous,
Voila j'ai une fonction qui se nomme "SaveDataMat", qui se trouve dans un fichier "filproc.m". Par ailleurs j'ai aussi une fonction qui se nomme "bnSave_callback" dans un fichier "frmExprtmarks.m". Dans le fichier "filproc.m" il y a une fonction d'enregistrement qui se nomme"SaveDataMat". Je voudrais savoir comment depuis "bnSave_callback " dans le fichier "frmExprtmark" je puis appeler "SaveDataMat" dans le fichier "filproc". Voici les codes correspondant aux différentes fonctions : SaveDataMat : Code :
%FUNCTION for saving processed data in .MAT-file
%This function is called by mnSaveDispl_Callback -
% menu item File->Saving of .MAT-files->Save displayed data in single file
function SaveDataMAT(Path, fName, SmartXXX, RawDataset, srcPath, trials, IChansAdded, Nms, varargin)
%Titles for synchronization modes
SynModes=[{'maximum value'}, {'minimum value'},{'global extremum'}, ...
{'begin of decrease'},{'begin of increase'},{'specific value'}];
%define MATRIX size for data saving
d3=size(SmartXXX,1); %the NUMBER of Trials (i.e. files)
d12=zeros(d3,3);
for dz=1:d3 %CYCLE by FILES
for dtype=1:3 %CYCLE by data type
d12(dz,dtype)=size(SmartXXX{dz}{4}{dtype},1);
end
end
dz12=max(d12,[],1); %vector-array (3 elems.) of MAX sizes for kinemat., EMG, FC
nLabs=SmartXXX{1}{3}(:); %The Number of labels of each type
opCell=cell(3,1);
%define structure array size for data saving
for dtype=1:3 %CYCLE by data type
ouDat=zeros(dz12(dtype),nLabs(dtype), d3);
%If data of varios length - equalize the lengths by adding NaN values
for dz=1:d3 %CYCLE by FILES
difz=dz12(dtype)-d12(dz,dtype);
if difz>0 ouDat(:, :, dz)=[SmartXXX{dz}{4}{dtype}; NaN(difz,nLabs(dtype))];
else ouDat(:, :, dz)=SmartXXX{dz}{4}{dtype}; end
end
opCell{dtype}=ouDat;
end
ffreq=[{'Frequency-kinematics'},{'Frequency-EMG'},{'Frequency-Force Platform'}];
ffreq(2,:)=num2cell(SmartXXX{1}{1});
% outdat - structure to save in .MAT-file
% build this structure from information loaded
%& recieved during data processing
outdat = struct('SourcePath', [], 'Trials',[],'Kinematics', [],'EMG',[], ...
'ForcePlate',[],'Frequencies',[], 'Labels',[],'DataStruct',[],'RawDataStruct',[]);
outdat.Kinematics=opCell{1};
outdat.EMG=opCell{2};
outdat.ForcePlate=opCell{3};
outdat.Frequencies=ffreq;
outdat.Labels=SmartXXX{1}{2};
outdat.DataStruct=SmartXXX{1}{3};
outdat.RawDataStruct=RawDataset;
outdat.SourcePath=srcPath;
outdat.Trials=trials;
outdat.AddedChansInfo=IChansAdded;
outdat.StartTime=SmartXXX{1}{7};
if size(varargin,2)>0 %data were synchronized - synchro data mode
s1=char(SynModes(varargin{1})); %Mode of synchronization
s=sprintf('Data synchronized on label %s (by %s)',varargin{2},s1); %which label was used for synchronization
% varargin=> SynModes(sMode), synLabel
outdat.SynchrInfo=s;
end
%SAVING marker information
MInfo=cell(d3,1); %place allocation for info of markers
for ntr=1:d3 %CYCLE by TRIALS
if size(SmartXXX{ntr},2)==8 %THERE is info of MARKERS
MInfo{ntr}=SmartXXX{ntr}{8};
end
end
outdat.MarkerInfo=MInfo;
outdat.MarkerNumber=Nms; %MAX marker number
save([Path, fName], 'outdat');
end
Code :
function bnSave_Callback(hObject, eventdata, handles)
global expdMarks Nmax SmartData nLab PathName FileName
% hObject handle to bnSave (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
ls=get(handles.lbLabs2copy,'String');
for nm=1:length(expdMarks)
nTr=expdMarks(nm).Tr;
if expdMarks(nm).Lb>nLab
nL=expdMarks(nm).Lb-1;
else
nL=expdMarks(nm).Lb;
end
LabNam=ls(nL);
Nmax=Nmax+1;
mInf=expdMarks(nm).mInfo;
mrkInfo=struct('Label',LabNam, 'XY', mInf(1:2),'nMarker',Nmax); %MARKER info
if size(SmartData{nTr},2)<8
SmartData{nTr}{8}=mrkInfo;
else
SmartData{nTr}{8}=[SmartData{nTr}{8} mrkInfo];
end
end
[FilName, PathName] = uiputfile({'*.mat','MAT-files (*.mat)'});
FileName
PathName
mrkInfo
save (PathName, FileName, mrkInfo);
close
Merci de vos réponse en attendant. |
|
|
|
|
|
#2 (permalink) |
![]() Date d'inscription: mars 2007
Localisation: Grasse
Âge: 34
Messages: 2 735
|
Bonjour,
Tu ne peux pas appeler directement la sous-fonction (SaveDataMAT) d'une fonction (filproc) sans passer par cette fonction (filproc). Tu es donc obligé d'appeler filproc, et de prévoir dans filproc le cas où tu veux aller directement dans SaveDataMAT. Ce n'est pas forcément très clair j'en suis consciente alors un petit exemple : Code :
%========= Fichier filproc.m
function filproc(varargin)
%il faudrait vérifier les arguments d'entree ici
switch varargin{1}
case 'SaveData'
SaveDataMAT(varargin(2:end));
end
%ici ta sous-fonction SaveDataMAT
%====================
%Dans l'autre fichier frmExprtmarks.m
%blablabla
%la sous-fonction bnSave_callback
function bnSave_Callback(hObject, eventdata, handles)
%blablabla
%appel à SaveData :
filproc('SaveData',...les arguments qui vont bien);
L'autre possibilité serait de sortir ta sous-fonction SaveDataMAT de la fonction filproc et d'en faire une fonction à part entière (plus propre à mon avis). Dans ce cas il serait bon de la renommer (il faut mieux mettre les noms de fonction entièrement en minuscules) et de savoir exactement où elle est déjà appelée. PS : si je peux me permettre, je vois que tu utilises des variables globales, je pense te l'avoir déjà dit mais on ne le dira jamais assez : les variables global c'est le MAL !!
__________________
Modératrice MATLAB - MATLAB R2007a sur Windows Vista - FAQ - Tutoriels - Modératrice un peu Office aussi Le respect du Forum commence par le respect des Règles - Les balises code c'est facile : un pti clic svp et pour les autres boutons c'est ici. Vous aurez plus de réponses si on vous comprend et en postant sur le Forum => Pas de questions techniques par MP (sinon vlan) GETA |
|
|
|
|
|
#3 (permalink) |
|
Nouveau membre du Club
![]() Date d'inscription: juin 2008
Localisation: dijon ( juste a coté de)
Âge: 49
Messages: 51
|
rebonjour
J'avais bien noté votre aversion pour les variables globales, mais je n'y suis pour rien, je récupère un code d'un russe qui parle anglais et je ne sais pas trop ce qu'il a fait. J'ai 100 pages de codes que je ne comprends pas (avec des fonctions partout et des variables qui changent régulièrement de nom) mais je dois faire des choses avec d'ici le mois de janvier. Donc c'est un peu la galère. Mais merci de votre aide, je vais m'y atacher des demain matin, et je pense que j'aurai d'autres questions pour vous a ce sujet, car je n'ai pas tout saisi. Mais en réfléchissant bien, j'espère trouver une solution, avec vos indications. Merci encore et a bientot. |
|
|
|
|
|
#4 (permalink) |
|
Nouveau membre du Club
![]() Date d'inscription: juin 2008
Localisation: dijon ( juste a coté de)
Âge: 49
Messages: 51
|
Bonjour a vous
depuis ce matin j'ai essayé de mettre en application vos conseil. Voici le code de la fonction filproc Code :
function varargout = fileproc(varargin)
% FILEPROC M-file for fileproc.fig
% FILEPROC: main running form (window) and function of the program.
% In order to begin data processing load one or several .TDF-files
% OR one .MAT-file, created earlier by this program
% on the base of 1 or more .TDF-files.
% After processing your data you may save results in .MAT-file:
% Menu File->Saving of .MAT-files->Save displayed data in single file
% (if you've changed data and not saving the changes try to exit,
% the program will demand a confirmation).
% Last Modified by GUIDE v2.5 14-Nov-2008 23:02:08
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @fileproc_OpeningFcn, ...
'gui_OutputFcn', @fileproc_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
switch varargin{1}
case 'SaveData'
SaveMATfile(varargin(2:end));
end
end
Code :
function bnSave_Callback(hObject, eventdata, handles)
global expdMarks Nmax SmartData nLab PathName FileName
% hObject handle to bnSave (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
ls=get(handles.lbLabs2copy,'String');
for nm=1:length(expdMarks)
nTr=expdMarks(nm).Tr;
if expdMarks(nm).Lb>nLab
nL=expdMarks(nm).Lb-1;
else
nL=expdMarks(nm).Lb;
end
LabNam=ls(nL);
Nmax=Nmax+1;
mInf=expdMarks(nm).mInfo;
mrkInfo=struct('Label',LabNam, 'XY', mInf(1:2),'nMarker',Nmax); %MARKER info
if size(SmartData{nTr},2)<8
SmartData{nTr}{8}=mrkInfo;
else
SmartData{nTr}{8}=[SmartData{nTr}{8} mrkInfo];
end
end
[FilName, PathName] = uiputfile({'*.mat','MAT-files (*.mat)'});
FileName
PathName
SmartData{nTr}{8}
save (PathName, FileName, 'mrkInfo');
filproc ('SaveData',PathName,FileName,mrkInfo);
close
Par contre la commande "save" ne crée aucun fichier, alors qu'il ouvre bien la boite de dialogue pour récupérer le chemin et les noms des fichiers a enregistrer. Je pense que c'est une solution moins compliquée que l'appel a une fonction d'un autre fichier. Si vous pouviez me débrouiller cela se serait bien et comme j'en ai besoin ailleurs, cela me ferait un exemple pour pouvoir enregistrer des données dans un fichier .mat Merci d'avance de me faire avancer dans cette foret où je n'ai pas de boussole pour m'orienter !!!!!! |
|
|
|
|
|
#5 (permalink) |
![]() Date d'inscription: mars 2007
Localisation: Grasse
Âge: 34
Messages: 2 735
|
Bon il y a plusieurs problèmes dans ton code.
1. Ceci : Code :
% End initialization code - DO NOT EDIT NE PAS EDITER EN DESSOUS DE CETTE LIGNE... Donc il faudrait plutôt faire ainsi : Code :
function varargout = fileproc(varargin)
% FILEPROC M-file for fileproc.fig
% FILEPROC: main running form (window) and function of the program.
% In order to begin data processing load one or several .TDF-files
% OR one .MAT-file, created earlier by this program
% on the base of 1 or more .TDF-files.
% After processing your data you may save results in .MAT-file:
% Menu File->Saving of .MAT-files->Save displayed data in single file
% (if you've changed data and not saving the changes try to exit,
% the program will demand a confirmation).
% Last Modified by GUIDE v2.5 14-Nov-2008 23:02:08
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @fileproc_OpeningFcn, ...
'gui_OutputFcn', @fileproc_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
%Cas spécifique :
if nargin %il y a au moins un argument
if strcmp(varargin{1},'SaveData') %le premier arg est SaveData
SaveMATfile(varargin(2:end));
return
end
end
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
Pour le problème de sauvegarde, cette ligne : Code :
save (PathName, FileName, 'mrkInfo'); C'est plutôt : Code :
save(fullfile(PathName,FileName),'mrkInfo');
__________________
Modératrice MATLAB - MATLAB R2007a sur Windows Vista - FAQ - Tutoriels - Modératrice un peu Office aussi Le respect du Forum commence par le respect des Règles - Les balises code c'est facile : un pti clic svp et pour les autres boutons c'est ici. Vous aurez plus de réponses si on vous comprend et en postant sur le Forum => Pas de questions techniques par MP (sinon vlan) GETA |
|
|
|
|
|
#6 (permalink) |
|
Nouveau membre du Club
![]() Date d'inscription: juin 2008
Localisation: dijon ( juste a coté de)
Âge: 49
Messages: 51
|
je ne suis pas un expert mais le code
Code :
save(fullfile(PathName,FileName),'mrkInfo'); j'ai besoin de vous tous, a bientot j'espère que vous me réponderez. Merci a caro-line elle m'aide tellement que je ne sais pas comment la remercier!!!! |
|
|
|
|
|
#7 (permalink) |
![]() Date d'inscription: mars 2007
Localisation: Grasse
Âge: 34
Messages: 2 735
|
Il n'y aurait pas un petit message d'erreur ?
Ça : Code :
[FilName, PathName] = uiputfile({'*.mat','MAT-files (*.mat)'});
__________________
Modératrice MATLAB - MATLAB R2007a sur Windows Vista - FAQ - Tutoriels - Modératrice un peu Office aussi Le respect du Forum commence par le respect des Règles - Les balises code c'est facile : un pti clic svp et pour les autres boutons c'est ici. Vous aurez plus de réponses si on vous comprend et en postant sur le Forum => Pas de questions techniques par MP (sinon vlan) GETA |
|
|
|
|
|
#8 (permalink) |
|
Nouveau membre du Club
![]() Date d'inscription: juin 2008
Localisation: dijon ( juste a coté de)
Âge: 49
Messages: 51
|
rebonjour j'espère pouvoir vous lire depuis chez moi car je travaille le soir. Voici les message d"'erreurs que j'ai lorsque je fais tourner le programme.
Code :
??? Undefined function or method 'eq' for input arguments of type 'cell'.
Error in ==> fullfile at 37
if (f(end)==fs) & (part(1)==fs),
Error in ==> frmExprtmarks>bnSave_Callback at 358
save(fullfile(PathName,FileName),'mrkInfo');
Error in ==> gui_mainfcn at 96
feval(varargin{:});
Error in ==> frmExprtmarks at 42
gui_mainfcn(gui_State, varargin{:});
??? Error using ==> waitfor
Error while evaluating uicontrol Callback
Code :
function bnSave_Callback(hObject, eventdata, handles)
global expdMarks Nmax SmartData nLab PathName FileName
% hObject handle to bnSave (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
ls=get(handles.lbLabs2copy,'String');
for nm=1:length(expdMarks)
nTr=expdMarks(nm).Tr;
if expdMarks(nm).Lb>nLab
nL=expdMarks(nm).Lb-1;
else
nL=expdMarks(nm).Lb;
end
LabNam=ls(nL);
Nmax=Nmax+1;
mInf=expdMarks(nm).mInfo;
mrkInfo=struct('Label',LabNam, 'XY', mInf(1:2),'nMarker',Nmax); %MARKER info
if size(SmartData{nTr},2)<8
SmartData{nTr}{8}=mrkInfo;
else
SmartData{nTr}{8}=[SmartData{nTr}{8} mrkInfo];
end
end
[FilName, PathName] = uiputfile({'*.mat','MAT-files (*.mat)'});
FilName
PathName
SmartData{nTr}{8}
save(fullfile(PathName,FileName),'mrkInfo');
close
Bref si vous pouvez m'aidez !!!!!! a lundi car depuis chez moi je ne suis pas certain d'avoir acces au forum. Dernière modification par Caro-Line ; 05/12/2008 à 16h38 Motif: Suppression de mentions inutiles |
|
|
|
|
|
#9 (permalink) |
![]() Date d'inscription: mars 2007
Localisation: Grasse
Âge: 34
Messages: 2 735
|
Il te dit qu'il y a un problème car l'un des paramètres rentré à FULLFILE est un tableau de cellules.
Le problème vient, je le soupçonne des variables globales. Il faut faire très attention aux nom de tes variables. FileName par exemple est une variable globale. Quand tu utilises UIPUTFILE tu lui demande en sortie FilName (sans le E), mais après c'est FileName (avec le E) que tu utilises dans le SAVE. Donc le FileName utilisé dans le SAVE est la variable globale qui a été définie un jour ailleurs et qui est surement de type CELL. Je suppose que le vrai nom de fichier que tu veux utiliser est celui retourné par UIPUTFILE, donc vérifie bien partout l'écriture et que tu n'as pas de faute de frappe (car là manifestement il y en a une).
__________________
Modératrice MATLAB - MATLAB R2007a sur Windows Vista - FAQ - Tutoriels - Modératrice un peu Office aussi Le respect du Forum commence par le respect des Règles - Les balises code c'est facile : un pti clic svp et pour les autres boutons c'est ici. Vous aurez plus de réponses si on vous comprend et en postant sur le Forum => Pas de questions techniques par MP (sinon vlan) GETA |
|
|
|
|
|
#10 (permalink) |
|
Nouveau membre du Club
![]() Date d'inscription: juin 2008
Localisation: dijon ( juste a coté de)
Âge: 49
Messages: 51
|
Bonjour
Il y avait effectivement une faute de frappe. Je suis passé dessus plusieurs fois sans la voir et j'en demande pardon a ceux qui se sont penchés sur ce code pour une simple faute de frappe. Merci a tous (et en particulier a cro-line) de votre aide. A bientot |
|
|
|
|
![]() |
![]() |
||
[débutant]passage d'une fonction a une autre dans deux fichiers différents.
|
||
| Outils de la discussion | |
|
|