How to return value from one function within Function Matlab
Mostrar comentarios más antiguos
Hello Everyone, I hope you are doing well.
I have create a function Stages, which take the prediction from model, bases on prediction the case statement is used to get the value from other functions e.g DFUNCTION,SFunction ,etc
I want to return the values for each case for example the case "Class 1" is selected , the function DFUNCTION run it should return [DValue,Dlength,dLevels,Dmaximum,Dminimum]
if case "Class 3" is selected it returns [SlidMaximum,SlidMinimum,Slidmeans]
but i am unable to do that
How can i do it in matlab
function [labels]=Stages(ImagePath)
I = imread(ImagePath);
im=imresize(I,[227 227]);
im = repmat(im,[1 1 3]);
Net=load('trainedmodel.mat');
label = classify(Net.trainedNet,im);
labels=string(label);
switch labels
case "Class 1"
[DValue,Dlength,dLevels,Dmaximum,Dminimum] =DFUNCTION(ImagePath);
case "Class 2"
[SLevels,SValue,SMinimum,SMaximum] =SFunction(ImagePath);
case "Class 3"
[SlidMaximum,SlidMinimum,Slidmeans] = SlidFunction(ImagePath);
case "Class 4"
[PMaximum,PMinimum,Pmeans]= PFunction(ImagePath);
case "Class 5"
[jMaximum,jMinimum,Jmeans] = JFunction(ImagePath);
case "Class 6"
[fMaximum,fMinimum,fmeans] = FFunction(ImagePath);
end
1 comentario
Stephen john
el 8 de Abr. de 2022
Editada: Stephen john
el 8 de Abr. de 2022
Respuestas (1)
Voss
el 8 de Abr. de 2022
Returning different sets of outputs from the function Stages, depending on the value of label
% One way
function varargout = Stages(ImagePath)
I = imread(ImagePath);
im=imresize(I,[227 227]);
im = repmat(im,[1 1 3]);
Net=load('trainedmodel.mat');
label = classify(Net.trainedNet,im);
switch label
case 'Class 1'
[varargout{1:nargout}] = DFUNCTION(ImagePath);
case 'Class 2'
[varargout{1:nargout}] = SFunction(ImagePath);
case 'Class 3'
[varargout{1:nargout}] = SlidFunction(ImagePath);
case 'Class 4'
[varargout{1:nargout}] = PFunction(ImagePath);
case 'Class 5'
[varargout{1:nargout}] = JFunction(ImagePath);
case 'Class 6'
[varargout{1:nargout}] = FFunction(ImagePath);
end
end
% Another way
function varargout = Stages(ImagePath)
I = imread(ImagePath);
im=imresize(I,[227 227]);
im = repmat(im,[1 1 3]);
Net=load('trainedmodel.mat');
label = classify(Net.trainedNet,im);
lookup = { ...
'Class 1' @DFUNCTION; ...
'Class 2' @SFunction; ...
'Class 3' @SlidFunction; ...
'Class 4' @PFunction; ...
'Class 5' @JFunction; ...
'Class 6' @FFunction};
[varargout{1:nargout}] = lookup{strcmp(lookup(:,1),label),2}(ImagePath);
end
6 comentarios
Stephen john
el 8 de Abr. de 2022
Stephen john
el 8 de Abr. de 2022
Walter Roberson
el 8 de Abr. de 2022
What do you want your code to do if the function is run without any output arguments being requested?
.... I have a suspicion that you are hoping to run the function with no output assignments, and want it to assign to variables with those particular names anyhow. There are situations in which MATLAB would allow that to be done, but in most circumstances it should be avoided.
Stephen john
el 8 de Abr. de 2022
Stephen john
el 8 de Abr. de 2022
Editada: Stephen john
el 8 de Abr. de 2022
@Stephen john The error you ran into is because the label wasn't one of 'Class 1' through 'Class 6' (maybe it was a string - I'm using character vectors here).
To the point of the original question: The different functions DFUNCTION, etc., return different numbers of outputs. And it is not known at the time Stages is called which of the functions DFUNCTION, etc., will be called within Stages since that is determined by the classification label of the input ImagePath, which is calculated within Stages.
The code that calls Stages cannot know whether Stages will return 3 outputs (in case the label is 'Class 3') or 5 (in case it's 'Class 1'), for instance, so one thing you can do is to modify the functions DFUNCTION, etc., to all return the same number of outputs by including some empty outputs. Then call Stages with that number of outputs.
Here is a simplified example:
% DFUNCTION called -> 5 outputs
[out1,out2,out3,out4,out5] = Stages(1)
% SFunction called -> 4 outputs with 5th "dummy" output returned here
[out1,out2,out3,out4,out5] = Stages(2)
% SlidFunction called -> 3 outputs with 4th and 5th "dummy" outputs returned here
[out1,out2,out3,out4,out5] = Stages(3)
% SlidFunction called -> 3 outputs; only 3 outputs captured
[out1,out2,out3] = Stages(3)
% DFUNCTION called -> 5 outputs, but only 3 outputs are captured here
% the other 2 are lost. That's why you'd have every function return 5 outputs
[out1,out2,out3] = Stages(1)
function varargout = Stages(ImagePath)
label = sprintf('Class %d',ImagePath);
switch label
case 'Class 1'
[varargout{1:nargout}] = DFUNCTION(ImagePath);
case 'Class 2'
[varargout{1:nargout}] = SFunction(ImagePath);
case 'Class 3'
[varargout{1:nargout}] = SlidFunction(ImagePath);
end
end
function [DValue,Dlength,dLevels,Dmaximum,Dminimum] = DFUNCTION(ImagePath)
DValue = 0;
Dlength = 1;
dLevels = 2;
Dmaximum = 3;
Dminimum = 4;
end
function [SLevels,SValue,SMinimum,SMaximum,out5] = SFunction(ImagePath)
SLevels = 5;
SValue = 6;
SMinimum = 7;
SMaximum = 8;
out5 = [];
end
function [SlidMaximum,SlidMinimum,Slidmeans,out4,out5] = SlidFunction(ImagePath)
SlidMaximum = 9;
SlidMinimum = 10;
Slidmeans = 11;
out4 = [];
out5 = [];
end
Categorías
Más información sobre Matrix Indexing en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!