Matlab - comparar dato en vector

 
Vista:

comparar dato en vector

Publicado por vane (4 intervenciones) el 27/01/2015 15:19:28
hola, estoy intentanto ingresar un dato Ax1 el cual intento comparar con los datos que forman parte de un vector Ax estos datos estan en una columna de un archivo excel.
se supone que si el dato existe en el vector deberia devolverme 'existe' y si no 'no existe'.
el problema es que siempre me dice que no existe aun cuando ingreso datos que si se encuentran en el vector.
ayuda urgente por favor

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
Ax = xlsread ('5050 yen dBm.xlsx',3,'A2:A47');
Ax1=STR2DOUBLE(get(handles.edit1,'string'));
for i=1:length(Ax)
if (Ax1==Ax(i))
c='existe';
set(handles.text2,'String',c)

else
a='no existe';
set(handles.text2,'String',a)
end
end
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
Imágen de perfil de Daniel
Val: 269
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

comparar dato en vector

Publicado por Daniel (264 intervenciones) el 27/01/2015 17:49:27
creo que el problema está en que la variable "c" se sobreescribe en cada paso del "for"
Esto se puede solucionar de varias maneras:

1) poner un break luego de encontrar uno que existe


1
2
3
4
5
6
7
8
9
10
for i=1:length(Ax)
if (Ax1==Ax(i))
c='existe';
set(handles.text2,'String',c)
break
else
a='no existe';
set(handles.text2,'String',a)
end
end

2) no poner el loop y cheaquear directamente todos juntos
(esta opción es mas prolija para mi)

1
2
3
4
5
6
7
8
9
10
if sum(sum(Ax==Ax1))~=0
 
c='existe';
set(handles.text2,'String',c)
 
else
a='no existe';
set(handles.text2,'String',a)
 
end


Saludos

Daniel

PD: una sutileza nada mas, en el código (1) conviene sacar las definiciones de a y c fuera del loop, así no es definen a cada paso de la iteracion:


1
2
3
4
5
6
7
8
9
10
c='existe';
a='no existe';
for i=1:length(Ax)
if (Ax1==Ax(i))
set(handles.text2,'String',c)
break
else
set(handles.text2,'String',a)
end
end
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

comparar dato en vector

Publicado por vane (4 intervenciones) el 27/01/2015 18:01:40
muchisimas gracias por tomarte el tiempo para responder.
lo hice de esta manera:
1
2
3
4
5
6
7
8
9
10
11
12
Ax = xlsread ('5050 yen dBm.xlsx',3,'A2:A47');
Ax1=STR2DOUBLE(get(handles.edit1,'string'));
[posicion,indice]=min(find(Ax==Ax1))
set(handles.text2,'String',posicion)
set(handles.text3,'String',indice)
if (indice==1)
    a='SI EXISTE';
    set(handles.text3,'String',a)
else
    l='NO EXISTE';
    set(handles.text2,'String',l)
end

me podrias ayudar con esto: necesito tomar cual es el valor mas cercano al dato Ax1 que estoy ingresando. es decir en el vector Ax cual es el valor que se acerca mas a Ax1? por favor me seria de muchisima ayuda.
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
Imágen de perfil de Daniel
Val: 269
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

comparar dato en vector

Publicado por Daniel (264 intervenciones) el 27/01/2015 18:34:56
Si Ax es tu vector y Ax1 es un número sería algo así:

1
indice=find(min(abs(Ax1-Ax))==(abs(Ax1-Ax)));


luego "indice" es la posición del valor mas cercano a "Ax1" y Ax(indice) es el valor mas cercano a Ax1 dentro del vector Ax

en el caso que Ax sea una matriz

1
[fila,columna]=find(min(abs(Ax1-Ax))==(abs(Ax1-Ax)));


Ax(fila,columna) es el valor mas cercano a Ax1 dentro de la matriz Ax

Nos estoy seguro pero posiblemente necesites pasar de número a texto usando "num2str" para ponerlos en los text de los objetos de tu GUI, algo así como:

1
2
set(handles.text2,'String',num2str(indice))
set(handles.text3,'String',num2str(Ax(indice)))


Saludos

Daniel
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

comparar dato en vector

Publicado por vane (4 intervenciones) el 27/01/2015 18:50:51
muchísimas gracias por tu ayuda. voy a probar . te escribiré para decirte como me fue.
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

comparar dato en vector

Publicado por vane (4 intervenciones) el 27/01/2015 19:15:56
amigo si me funciono =) mil gracias.
una pregunta. cuando el numero que ingreso se encuentra a la mitad de dos valores, es decir,
ejemplo:
Ax = [ 540,600,640,700,740,800,840]
Ax1=820

me regresa 2 valores como respuesta
indice=find(min(abs(Ax1-Ax))==(abs(Ax1-Ax)));
indice =
800
840
necesito que sea un solo y si puede ser el menor es decir 800 muchoo mejor.

espero no molestar.
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
Imágen de perfil de Daniel
Val: 269
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

comparar dato en vector

Publicado por Daniel (264 intervenciones) el 27/01/2015 21:15:13
si los valores están ordenados en forma ascendente, como en el ejemplo podes poner

1
2
indice=find(min(abs(Ax1-Ax))==(abs(Ax1-Ax)),1,'first');
disp(indice)

si no estan ordenados por ejemplo

Ax = [ 540,600,640,700,740,840,800]

1
2
indice=find(min(abs(Ax1-Ax))==(abs(Ax1-Ax)))
indice=find(Ax==min(Ax(indice)))


Saludos

Daniel
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