Matlab - Problemas con "find" o algo que no entiendo.

 
Vista:

Problemas con "find" o algo que no entiendo.

Publicado por Llanhelo (3 intervenciones) el 18/10/2011 17:53:06
[b]Hola[b], tengo un problema desagradable, "creo" que con el comando "find".

En resumen mi codigo es el siguiente,
___________________________________________________________________________
clear all
for i=18:.09:45

file_lab = ['/media/4461A96901098325/DOCUMENTOS/Ramos_2011/Material_Tesis/Data/Perfiles/Perfiles_l
ab3/lab_',num2str(i)];
file_icd = ['/media/4461A96901098325/DOCUMENTOS/Ramos_2011/Material_Tesis/Data/Perfiles/Perfiles_ic
d3/icd_',num2str(i)];
file_moho = ['/media/4461A96901098325/DOCUMENTOS/Ramos_2011/Material_Tesis/Data/Perfiles/Perfiles_M
oho3/moho_',num2str(i)];
file_topobat = ['/media/4461A96901098325/DOCUMENTOS/Ramos_2011/Material_Tesis/Data/Perfiles/Perfiles_t
opobat3/topobat_',num2str(i)];
lab = load(file_lab);
icd = load(file_icd);
moho = load(file_moho);
topobat = load(file_topobat);

lon_lab = lab(:,1);
zgeom_lab = -lab(:,3);

lon_icd = icd(:,1);
zgeom_icd = -icd(:,3);

lon_moho = moho(:,1);
zgeom_moho = -moho(:,3);

lon_topobat = topobat(:,1);
zgeom_topobat = topobat(:,3);

vp = [min(zgeom_topobat):0.1:max(zgeom_lab)]';
z = nan(length(vp),length(lon_lab));

%%%%% PROBLEMA %%%%%%%%%%
for j=1:length(zgeom_lab)
vec = [zgeom_topobat(j):0.1:zgeom_lab(j)]';
z(find(vp == vec(1)):length(vp),j) = vec;
end
%%%%%%%%%%%%%%%%%%%%%%%%


end
____________________________________________________________________________

Tal como lo señalo en el codigo, el problema se encuentre al interior del bucle for.
Si corro el codigo completo, el error que arroja es:
-----------------------------------------------------------------------------------
??? Subscripted assignment dimension mismatch.
-----------------------------------------------------------------------------------

y eso es debido a que la parte:
---------------------------------------------------
z(find(vp == vec(1)):length(vp),j) = vec;
----------------------------------------------------
, el find no encuentra el numero "vec(1)" en el vector columna "vp".

Hasta el momento he hecho varios test y veo que mi vector "vp", para i=1, es decir para el primera corrida del bucle for princial, tiene elementos de -4 hasta 8, con incremento de 0.1.

En concreto,
find(vp==5.8) , arroja:

ans = Empty matrix: 0-by-1

es decir, dice que no hay un valor 5.8 en vp. Les aclaro que 5.8, Si esta en vp. Lo extraño es que si busco el valor como : 4.4, 2.3, etc me arroja el indice que busco. pero con algunos, como el 5.8 y otros mas, me dice que no estan en el vector "vp". No hay repeticion de ningun valor en "vp", es decir, cada valor es unico dentro del vector vp.



Si me pueden ayudar, estaré muy agradecido.

Saludos,

Pd: disculpen si no se entiende mucho.
Pd2: los datos cargados fueron previamente formateados, y en este caso los datos que estudiamos con, %6.1f, es decir, con un ancho de 6 mas una cifra significativa.
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

Problema sencillo y resumido.

Publicado por Llanhelo (3 intervenciones) el 18/10/2011 21:51:57
Hola nuevamente.

Encontre una forma mejor de explicitar este problema:

Abran matlab y realicen el siguiente ejercicio:

Crear el siguiente vector:

v = [-5:0.1:120.5];

luego busquen con "find" el valor 5.8, es decir:

find(v == 5.8)

matlab le deberia responder que ese numero no se encuentra, o lo que es equivalente a:
ans = Empty matrix: 0-by-1

La pregunta casi obvia es ¿Por qué sucede esto? y ¿Tiene solución?

- Si quieren busquen otros numeros con decimales (que esten dentro del vector) y veran que algunos si los encuentra y otros no.


Saludos.
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

Problema sencillo y resumido.

Publicado por Jorge (226 intervenciones) el 21/10/2011 09:20:13
Es un típico error de precisión.

Haz esta sencilla operación 3*(4/3 - 1) - 1

¿Cuánto obtienes con Matlab?
¿Cuánto deberías obtener?

Para resolver tu problema se debe considerar una tolerancia, no un valor tajante. Evita buscar así
find(v == 5.8)

Una manera de resolverlo es, por ejemplo

v = [-5 : 0.1 : 120.5];

tol = .0001;
li = 5.8 - tol;
ls = 5.8 + tol;
find( li < v & v < ls )

y ahora sí encuentra el índice sin problemas

.
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