passing array to gui in matlab - matlab

I want to pass an array to a gui and display each element of that array on axes...the elements are the filenames of images...I have written a piece of code...this is my xyz.m file from which i want to pass an array "result" to a gui result_image.m
result_image(result);
In opening_fn of the gui i wrote...
result = varargin{1};
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
%axes(handles.axes1);
%imshow(im2fn);
for jj = 1:length(result)
axes(handles.axesjj);
imshow(result(jj));
I am getting an error as str2func
Invalid function name ''
I dunno what is '' here and also iam getting the error on line result_image(result);
Please Help me!

If you have a look at this it will tell you in detail how to add input arguments to your UI. In fact it's a little more complicated than simply adding a varargin to your OpeningFcn arguments. The reason is that you have to edit the bit of code that begins with the words DO NOT EDIT :-)
You must add some bit of code that allows it to determine that it shouldn't run the code gui_State.gui_Callback = str2func(varargin{1});. Normally, this bit of code allows external access to the functions (i.e. UI calbacks) in your file, but because it's inside the if statement if nargin && ischar(varargin{1}), when you pass an argument to your UI that is a string, it thinks you're trying to get a handle to one of the functions in the file and calls str2func on the empty string you passed it (which is in varargin{1}).
So that's why it doesn't work. You could probably fix this simply by using varargin{2} as your input argument instead and opening your UI with result_image([], result), so that ischar(varargin{1}) is false. To make it a bit more robust, you should probably change
if nargin && ischar(varargin{1})
to
if nargin > 0 && nargin < 2 && ischar(varargin{1})
Note that the fact that you have passed it an empty string in the first place is probably indicative of a bug in your code that opens the UI (i.e., whatever generates result).

Related

How to know if an mcc-compiled MATLAB function is called in MATLAB or via standalone application?

I have a MATLAB function that has been compiled into a standalone application with mcc. When the user works with the function through the standalone application, output arguments are not used and instead I would like to ensure that the user gives an address to an output file as an input argument.
For instance, say my MATLAB function myFunc is defined like this:
function out_mat = myFunc(nElem, varargin)
save_file = false;
if nargin == 2
save_file = true;
add_to_file = varargin{1};
end
out_mat = rand(nElem);
if save_file
% Write out_mat to address add_to_file....
end
end
When called in MATLAB, the user can define an output address (add_to_file) or not. It is up to the user and I do not care! But if the user is using the standalone executable, I want to make sure that the user actually defines add_to_file. So basically I want to add a condition like this to my code:
if call_in_matlab
narginchk(1,2);
else
narginchk(2,2);
end
How do I check if call_in_matlab is true or false? In other words, how can I tell in a function is called through its compiled standalone application or in MATLAB?
There are some functions in MATLAB to support Compiler-generated stand-alone programs. See the documentation. In particular, you want isdeployed.

Matlab postset method sample fails

I'm trying to call a function right after I change some properties of an object in Matlab. I went to the documentation and found this sample code:
classdef PropListener < handle
properties (SetObservable, AbortSet)
PropOne
PropTwo
end
methods
function obj = PropListener(evtobj)
if nargin > 0
addlistener(evtobj,'PropOne','PostSet',#PropListener.handlePropEvents);
addlistener(evtobj,'PropTwo','PostSet',#PropListener.handlePropEvents);
end
end
end
methods (Static)
function handlePropEvents(src,evnt)
switch src.Name
case 'PropOne'
display('I was here!');
case 'PropTwo'
display('I was here too!');
end
end
end
end
I saved this into a file, went to the console and tryed
test1=PropListener
test1.PropOne=1
and it doesn't show the "I was here!" message. The rest works perfectly.
After some debuging, I found 2 problems:
1 - It calls the constructor method without arguments, therefore
if(argin>0)
returns always false and it never creates the listeners.
2 - If I remove the if/end structure, when I call the constructor
test1 = PropListener
Matlab returns "Error using PropListener (line 9)
Not enough input arguments."
(line 9 is the line with the following statement)
addlistener(evtobj,'PropOne','PostSet',#PropListener.handlePropEvents);
Now, if I remove the whole constructor method and call
addlistener(evtobj,'PropOne','PostSet',#PropListener.handlePropEvents);
on the command line, everything works, but I would have to remember to call that line while writing my scripts, and I don't want to run that risk.
I'd like to know how could I implement this postset feature, and any help would be greatly appreciated.
Thanks in advance,

MATLAB GUI issue with getting/setting values

I'm facing a problem in MATLAB that I don't really know what might be the cause. I have a GUI build with GUIDE on MATLAB R2007b. In this GUI I have a edit used for typing in a file name that is then used for saving some data. I use the edit callback function to test if the file name is valid by checking the string received with get(hObject,'String') on emptyness and then activate/ deactivate the load button if the typed file name exists or not. The string value gets also saved into a variable in the handles structure.
The issue I'm facing now is, that for some reason, the setting of the file name does not work if i type the name 'default' or if the name typed is empty. The statement in the if (isempty(handles.fileName)) block gets executed when nothing is typed in the edit. when default is typed in the string shown in the edit is deleted. Below you can find the code of the callback function.
In the OpeningFcn:
handles.fileName = 'default';
My Callback:
function edit_fileName_Callback(hObject, eventdata, handles)
handles.fileName = get(hObject,'String');
if (isempty(handles.fileName))
handles.fileName = 'default';
disp(handles.fileName)
end
handles.fileName = strrep(handles.fileName,' ','_');
set(hObject,'String',handles.fileName);
if exist(['trajectories/' handles.fileName '.mat'],'file') == 2
set(handles.pushbutton_load,'Enable','on')
else
set(handles.pushbutton_load,'Enable','off')
end
guidata(hObject, handles);
Has someone an idea why this issue might occur? I'm hanging now for quite some time on this issue and have not found yet any solution.
Thanks
Edit 1:
what i found out so far is that the value returned from get(hObject,'String'); and the string coded handles.fileName = 'default'; are not exactly the same. I've added the line disp(['fileName: ' handles.fileName]) to the callback and it shows the a difference with a typed name or when set in the code:
Self typed:
fileName: test
Set by code:
fileName:
default
The coded version somehow adds itself a newline.
Edit 2:
The issue described in Edit 1 was due to a misplacement of the disp command.
Edit 3 / Workaround:
It seems that the string 'default' itself was the cause of trouble. When using another default value it works seamlessly. Furthermore, when 'default' is typed in the field the edit itself does not work properly anymore. seems to be some bug.

Programmatically save changes of an editable uitable

I created an UItable in Matlab which I fill with various values and options.
It looks like:
the corresponding code is the following:
selector_1 = { 'A'; 'B' ; 'C' };
selector_2 = { 'A.1'; 'A.2'; 'A.3'; ...
'B.1'; 'B.2'; 'B.3'; ...
'C.1'; 'C.2'; 'C.3' };
rows = 5;
f = figure('name','Configuration of output','Position',[200 200 430 25+rows*20],'numbertitle','off','MenuBar','none');
dat = {'select outputfile...', 'select identifier...', 'Specifier', 'Index'};
dat = repmat(dat,rows,1);
columnname = {'Output file ',...
'Identifier ',...
'Specifier ', 'Index'};
columnformat = { {selector_1{:}}, {selector_2{:}}, 'char', 'numeric' };
columneditable = [true true true true];
t = uitable('Units','normalized','Position',...
[0 0 1 1], 'Data', dat,...
'ColumnName', columnname,...
'ColumnFormat', columnformat,...
'ColumnEditable', columneditable,...
'RowName',[]);
set(t, 'Data', dat,'celleditcallback','get(t,''Data'')');
So I run the code and the figure is open. The underlying script has therefore finished.
When I now edit the table my uitable object is changed and after I finished I can get my final configuration with:
finalconfig = get(t,'Data');
But the thing is I need manually type this line, because my script has already finished. If I put this line at the end of my script, I get an error.
So I thought about using the following loop, to detect when I close the table and to store the last configuration
while ~isempty(findobj('name','Configuration of output'))
% some action
end
finalconfig = get(t,'Data');
And I tried everything to put inside the loop, the whole script, just the set command including the celleditcallback, and other things, but nothing worked. Either my script get stucked inside the loop or the display of my table is not updated when I edit a value. I also tried drawnow at different positions. How one handles this situation? How can I automatically store my final results?
I assume "closing the window" is the best action to detect, as I don't think I could implement a "save" button. I also tried to create a gui using GUIDE but got completely lost, I hope to solve it without.
Edit:
I was now able to implement a "save"-button and tried the callback as follows:
uimenu('Label','Save configuration','Callback',#saveConfig);
function saveConfig(~,~)
output = get(t,'Data',);
save([pwd 'output.mat'],'output');
end
also I implemented a custom CloseRequestFcn as suggested by Lucius Domitius Ahenobarbus. But then I have either one of the following problems:
1)
I define everything as a script, everything works fine, but I need to define functions like #saveConfig (actually my favorite) or #my_Closefcn as a unique function-file in my workspace and I have a hard time to pass the right parameters as dat always remains the same, even though it actually gets changend.
(The example from the mathworks site works! But it doesn't need additional parameters.)
2) When I use
function configuration
% my script from above
end
I can implement #saveConfig or #my_Closefcn directly (nested) and I guess the passing of the parameters would work fine. But the editing of my table does not work anymore, throwing the following error:
Error using handle.handle/get
Invalid or deleted object.
Error while evaluating uitable CellEditCallback
How to solve that?
Now that I know that I can even add buttons to an uitable I REALLY like to avoid GUIDE.
My code above is executable, so I'd be glad if you try it to see what my actual problem is, as it is hard to describe.
depending on using GUIDE or not:
use the CloseRequestFcn->
without GUIDE use:
%write your own CloseRequestFcn and set the figure CloseRequest-Callback to it:
set(gcf,'CloseRequestFcn',#my_closefcn)
%use gcf or the handle of the figure directly
and define my_closefcn including a delete statement for the figure-handle, else the figure will not close :)
See the docs for more information about "Redefining the CloseRequestFcn".
with GUIDE:
you can edit the CloseRequestFcn by inspecting the figure. There is a field called CloseRequestFcn that will create the function automatically and you dont need to take care about getting the handle. It will look like this:
function figure1_CloseRequestFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: delete(hObject) closes the figure
delete(hObject);
Now BEFORE deleting the figure, you should be able to get the data of the uitable (if you have the handle) and I would suggest to just assign the data to the base workspace, like:
assignin('base', 'finalTableData', get(myTableHandle,'Data'));
EDIT
as I was not clear enough, see this example:
(use within one single script)->
function test
h=figure;
x=1:10;
mytable=uitable(h,'Data',x);
set(h,'CloseRequestFcn',#myCloseFcn)
%give a unique Tag:
set(h,'Tag', 'myTag')
set(mytable,'Tag','myTableTag')
end
function myCloseFcn(~,~)
myfigure=findobj('Tag','myTag');
myData=get(findobj(myfigure,'Tag','myTableTag'),'Data')
assignin('base','myTestData',myData)
delete(myfigure)
end
in fact, there is no need to take care for the parameters of your Closereq-Callback, if you know how to find the handle of the figure! Just give something to your figure/uitable that you are able to identify it later on. I used 'Tag', because the first thing I would think of, but there would be other parameters as well.
There are only two differences I can think of between running the code directly after the code, or inside the code.
1. Scope
Perhaps you are actually working with functions, rather than scripts. In this case the problem may be that inside your function, something you need is out of scope.
2. Timing
Though it is rare, sometimes the computer may seem to be finished, whilst it is actually still busy (for a few milliseconds or so).
Here are the steps to a general approach:
Make sure there is a trivial line at the place where you want to insert your command (1==1 for example)
Put a breakpoint at the line
Once matlab stops at the breakpoint, wait a second and try to run your command.
If it works I would bet on problem number 2. try placing a pause(1) before your command and see whether it helps.
If it doesn't work you are likely meeting problem number 1. Now it becomes a matter of finding the right place to put your command. And if the command cannot be put somewhere else in the code, perhaps try an ugly evalin(,'base'). However, the latter should really be considered a workaround rather than a solution.

Error when calling local variable in GUI MATLAB

I'm getting this error:
Error in ==> APP>pushbutton2_Callback at 109
img=imread(FileName)
When I try to use FileName in pushbutton2_Callback I'm getting the error mentioned
FileName is variable in pushbutton1_Callback.
You need to pass the variable FileName from one callback to the other. To do this, you can assign the variable to the 'UserData' field of pushbutton1. Your code under pushbutton1_Callback should look something like:
FileName=uigetfile();
set(handles.pushbutton1,'UserData',FileName);
Next, you need to read in the variable under your pushbutton2_Callback:
FileName=get(handles.pushbutton1,'UserData');
img=imread(FileName);
If you want to check your results, you can always leave the semicolons off the end of the lines.
There's a general method to store data with your gui for use between callbacks. You can add arbitrary fields to the handles object, so you can put in your pushbutton1 callback
handles.filename = FileName;
guidata(hObject,handles);
The second line is boilerplate code that you need to put at the end of any callback that changes values in the handles structure.
Now all of your callbacks will have access to the file name. In your specific case, in callback 2, you would have
img = imread(handles.filename);
Of course, you might want to use this image later on in another function, so you can store it in handles too
handles.img = img;
guidata(hObject, handles);