Matlab - Ayuda guide a un principiante

 
Vista:

Ayuda guide a un principiante

Publicado por Pablo (2 intervenciones) el 23/08/2007 17:25:10
Hola, soy un principiante en esto del Matlab y necesito representar en una gráfica una variable que es una matriz con dos columnas. El problema es que si creo con guide un listbox en el que aparezacan todas las variables creadas y selecciono la que quiero representar, no se como puedo hacer referencia a esta selección en el m-file. Necesitaría saber si dentro del m-file del guide puedo reconocer a la selección como una variable para des pués descomponerla en dos variables ( A=Z(:,1); B=Z(:,2); ) y poder representarla.

Lo que trato, es de poner un entorno gráfico a lo que ahora hago bajo la ventana de comandos:

%Compara dos ensayos representandolos, los datos hay que importarlos
%previamente desde un archivo .dat con file-import data (uiimport)
disp('Los datos han de ser columnas de una matriz')
Z=input('Escriba el nombre del fichero de datos o la variable creada ');
A=Z(:,1);
B=Z(:,2);%con esto quedan definidos los dos ejes de coordenadas A y B
W=input('Escriba el nombre de la siguiente variable ');
C=W(:,1);
D=W(:,2);%C y D son los ejes de coordenads del otro ensayo
%Configuración del gráfico
%ejex=input('Escriba una etiqueta para el eje X')
%ejey=input('Escriba una etiqueta para el eje Y')
subplot(3,1,1)%para dividir el espacio en 3 gráficos
plot(A, B, 'DisplayName', 'B vs A', 'XDataSource', 'A', 'YDataSource', 'B'); figure(gcf)
xlabel('cm-1')
ylabel('Señal')
title('gráfica del primer ensayo')
%nombre = input('Escriba un título para la gráfica','s')
%title(nombre)
axis([min(A),max(A),min(B)-100,max(B)+100])
%axis('auto') Este comando autoescala los ejes
subplot(3,1,2)
plot(C, D, 'DisplayName', 'C vs D', 'XDataSource', 'C', 'YDataSource', 'D'); figure(gcf)
xlabel('cm-1')
Ylabel('Señal')
title('gráfica del segundo ensayo')
axis([min(C),max(C),min(D)-100,max(D)+100])
%axis('square') Este comando hace que los ejes sean cuadrados
subplot(3,1,3)
plot(A,B,C,D)
xlabel('cm-1')
ylabel('Señal')
title('gráfica comparación de los dos ensayos')
%ponergrid%abre la variable ponergrid para poder elegir el grid
%sólo afecta al último gráfico
%axis([350,3300,-500,8000])
ajustaejes%toma unos ejes acordes a los valores máximos

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda guide a un principiante

Publicado por Julian Cuintaco (75 intervenciones) el 23/08/2007 21:04:44
Hola

Quizá te sirva la función EVAL que sirve para evaluar una cadena de caracteres. Me explico, si en el ListBox tienes por ejemplo, las variables A y B. Para referirse en código a esas variables o mejor, al contenido de esas variables, utilizas la instrucción eval(A) y eval(B), respectivamente.

En tu caso,

A=eval(A);
B=eval(B);
subplot(2,1,1),plot(A(:,1),A(:,2)), grid on
subplot(2,1,2),plot(B(:,1),B(:,2)), grid on

Suerte....

Julian C.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda guide a un principiante

Publicado por Pablo (2 intervenciones) el 24/08/2007 10:38:26
Gracias por tu ayuda, pero todavía no consigo solucionar el problema. Lo que necesito es añadir al siguiente código lo necesario para crear otro botón, que una vez seleccionado de la lista una variable con dos columnas, me la represente.

function varargout = lb1(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @lb1_OpeningFcn, ...
'gui_OutputFcn', @lb1_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
function lb1_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
update_listbox(handles)
set(handles.listbox1,'Value',[])
function varargout = lb1_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function update_button_Callback(hObject, eventdata, handles, varargin)
update_listbox(handles)
function update_listbox(handles)
vars = evalin('base','who');
set(handles.listbox1,'String',vars)

function [var1,var2] = get_var_names(handles)
% Returns the names of the two variables to plot
list_entries = get(handles.listbox1,'String');
index_selected = get(handles.listbox1,'Value');
if length(index_selected) ~= 2
errordlg('You must select two variables','Incorrect Selection','modal')
else
var1 = list_entries{index_selected(1)};
var2 = list_entries{index_selected(2)};
end

function plot_button_Callback(hObject, eventdata, handles, varargin)
[x,y] = get_var_names(handles);
figure(gcf)
evalin('base',['plot(',x,',',y,')'],'errordlg(lasterr,''Error generating plots'',''modal'')')

%hasta aquí funciona y representa las 2 variables de una columna cada una que %se seleccionan de la listbox

He intentado cambiando esto:
var1 = list_entries{index_selected(1)};
handles.var1=var1;
guidata(hObject,handles);
var2 = list_entries{index_selected(2)};
handles.var2=var2;
guidata(hObject,handles);
y poniendo en el callback del boton:
A=eval(handles.var1);
B=eval(handles.var2);
subplot(2,1,1),plot(A(:,1),A(:,2)), grid on
subplot(2,1,2),plot(B(:,1),B(:,2)), grid on

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar