How to use callbacks to plot data from an existing matlab data file?

Hello. I am having trouble grasping the way callbacks work to get my user interface code working properly. What I'm trying to do is this:
I have 4 sliders that select the indexes for picking up data from an already existing .m file (a 5D array), after which a for loop runs through the last dimension to get the y values for my x-y plot.
Right now the code does not work because the way my S.y function is defined isn't allowed - it should be a cell array, but I don't really think I need that.
All of what I need is pretty much coded, but the way my lines for S.y and y are coded won't allow the update functions to work properly.
function [] = slider_plot()
load wavelength.mat;
load grating_spacing.mat;
load diffraction_order.mat;
load angle_falling.mat;
load angle_dispersion_1_dgrating.mat;
% Plot different plots according to slider location.
% Define figure, normalized position can be adjusted to fit individual
% monitors.
S.fh = figure('units','normalized',...
'Position', [0.515 0.025 0.415 0.87]);
% Define axes so that room is available in figure window for sliders
S.ax = axes('unit','normalized',...
'position',[0.03 0.1 0.5 0.85]);
% General function
for l = 1:length(wavelength)
S.y(l) = @(par) angle_dispersion_1_dgrating(l, par(1), par(2), par(3), par(4));
end
% Define inital parameter values
S.a = 1; %angle falling
S.b = 1; %diffraction order
S.c = 1; %grating spacing
S.d = 1; %transmission or reflection, 1 - transmission
% x axes
S.x = wavelength;
hold on;
% Plot curve
S.p2 = plot(S.x,S.y);
hold off;
update(S);
% Slider for angle falling parameter:
S.aSlider = uicontrol('style','slider',...
'unit','normalized',...
'min',1,'max',length(angle_falling),'value', S.a,...
'position',[0.53 0.9 0.2 0.05],...
'sliderstep',[1 1],...
'callback', {@SliderCB, 'a'});
% Add a text uicontrol to label the slider.
txta = uicontrol('Style','text',...
'unit','normalized',...
'position',[0.2 0.11 0.7 0.02],...
'String','Angle of incidence, deg.');
% diffraction order Slider:
S.bSlider = uicontrol('style','slide',...
'unit','normalized',...
'min',1,'max',length(diffraction_order),'value', S.b,...
'sliderstep',[1 1],...
'callback', {@SliderCB, 'b'});
% Add a text uicontrol to label the slider.
txtb = uicontrol('Style','text',...
'unit','normalized',...
'String','Diffraction order');
% grating spacing Slider:
S.cSlider = uicontrol('style','slide',...
'unit','normalized',...
'min',1,'max',length(grating_spacing),'value', S.c,...
'sliderstep',[1 1],...
'callback', {@SliderCB, 'c'});
% Add a text uicontrol to label the slider.
txtc = uicontrol('Style','text',...
'unit','normalized',...
'String','Grating spacing, m');
% transmission or reflection, 1 - transmission Slider:
S.dSlider = uicontrol('style','slide',...
'unit','normalized',...
'min',1,'max',2,'value', S.d,...
'sliderstep',[1 1],...
'callback', {@SliderCB, 'd'});
% Add a text uicontrol to label the slider.
txtd = uicontrol('Style','text',...
'unit','normalized',...
'String','Transmission-reflection select');
guidata(S.fh, S); % Store S structure in the figure
end
% Callback for all sliders defined above
function SliderCB(aSlider, EventData, Param)
S = guidata(aSlider); % Get S structure from the figure
S.(Param) = get(aSlider, 'Value'); % Any of the 'a', 'b', etc. defined
update(S); % Update the plot values
guidata(aSlider, S); % Store modified S in figure
end
% Plot update function, creates new y-vector for plot and replaces the plot
% S.p2 with new y-vector
function update(S)
load wavelength.mat;
for l = 1:length(wavelength)
y(l) = S.y([S.a, S.b, S.c, S.d]);
end
set(S.p2, 'YData', y); % Replace old plot with new plotting values
end

2 commentaires

How should y look like? I imagined a vector, but your code tries to write 4 values to each y(l), but always the same 4 values.
The x is wavelength, the y is
for l = 1:length(wavelength)
y(l) = angle_dispersion_1_dgrating(l, a, b, c, d);
end
It is just a simple 2D plot. a, b, c, d are the parameters that I'm supposed to adjust with sliders, which are just simple indexes in case I change up the data. I can view the actual values of those parameters using a textbox or legend if I want to. That's all there is to what I want from my code. (angle_dispersion_1_dgrating is a pre-supplied .m file with the y values I need)

Connectez-vous pour commenter.

 Réponse acceptée

Stephen23
Stephen23 le 8 Août 2018
Modifié(e) : Stephen23 le 8 Août 2018
Function handles are scalar by definition: they cannot be formed into an array of function handles, as you are trying to do. To store multiple function handles you will need to put them into a cell array:
for kk = 1:numel(...)
S.y{kk}) = @(par) ...
end
and then when calling those functions:
for kk = 1:numel(S.y)
S.y{kk}(...)
end

4 commentaires

Edvinas Gvozdiovas
Edvinas Gvozdiovas le 8 Août 2018
Modifié(e) : Edvinas Gvozdiovas le 8 Août 2018
Thank you! Is there anything I have to change for the 2D plot to work? By that I mean the differences between your average plot(x,y) of array data to this kind of cell array data.
I assume I'll have to use fplot?
If the output of S.y{l} is not scalar then this allocation will throw an error (even after calling the function correctly):
for kk = 1:length(wavelength)
y(kk) = S.y{kk}([S.a, S.b, S.c, S.d]);
end
because the indexing on the LHS specifies exactly one element, but the RHS then has zero/multiple elements. You will have to either:
  • use a cell array to store the output, or
  • make the LHS indexing refer to the same number of elements as the RHS has. What size numeric array to use depends on the output of that function, which you have told us nothing about.
As an aside: avoid l as an index variable: with most typefaces it is visually hard to distinguish from the digit one.
The output in this case would be exclusively a scalar. I should be able to work this out, thanks a lot!
"The output in this case would be exclusively a scalar"
In that case there should be no problems with that allocation.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Interactive Control and Callbacks dans Centre d'aide et File Exchange

Produits

Version

R2016a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by