Matlab - Buscar texto en un arreglo y compararlo con otro

 
Vista:
sin imagen de perfil
Val: 65
Ha aumentado su posición en 2 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Buscar texto en un arreglo y compararlo con otro

Publicado por José (35 intervenciones) el 18/05/2020 19:15:33
Buena tarde.

Por favor requiero ayuda con el siguiente problema.

Tengo un arreglo tipo cell como el siguiente (al cual se le pueden agregar más valores):

sis_add =

2×1 cell array

{'El Centro'}
{'Armenia' }

Además tengo este otro arreglo tipo cell:

sismos = {'elcentro.txt','armenia.txt','mexico_n.txt','paez.txt','loma_ew.txt','loma_ns.txt','loma_ver.txt'}

Del cual quiero que se cree un arreglo en el orden del primero pero con la información del segundo, para obtener luego cada uno de los que contienen el .txt y utilizar la función load.

Les agradecería mucho solucionar esta duda.
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 JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Buscar texto en un arreglo y compararlo con otro

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 18/05/2020 23:46:07
Estimado no se entiende la pregunta. Podría poner un ejemplo pequeño de lo desea hacer exactamente.
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
sin imagen de perfil
Val: 65
Ha aumentado su posición en 2 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Buscar texto en un arreglo y compararlo con otro

Publicado por José (35 intervenciones) el 19/05/2020 00:14:28
José en el primer arreglo estan 'El Centro' y 'Armenia' , y quiero que extraiga de la variable sismos los mismos del primer arreglo pero con el nombre que tienen en el segundo que serían 'elcentro.txt' y 'armenia.txt'
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 JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Buscar texto en un arreglo y compararlo con otro

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 19/05/2020 01:19:46
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
clear
sismos = {'elcentro.txt','armenia.txt','mexico_n.txt','paez.txt','loma_ew.txt','loma_ns.txt','loma_ver.txt'};
sis_add={'El Centro';'Armenia' };
u=lower(sis_add);
m=strrep(u,' ','');
k=1;
for i=1:length(sis_add)
    for j=1:length(sismos)
        if strcmp(sismos{j}(1:end-4),m{i})
        r{k,1}=sismos{j};
        k=k+1;
        end
    end
end
r

1
2
3
4
5
>> celdas11
r =
  2×1 cell array
    {'elcentro.txt'}
    {'armenia.txt' }





Saludos
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
Servicios de programación matlab
Servicio de Asesoría Online Personalizada en Matlab
[email protected]


http://matlabcaballero.blogspot.com
https://www.facebook.com/matlabcaballero
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
sin imagen de perfil
Val: 65
Ha aumentado su posición en 2 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Buscar texto en un arreglo y compararlo con otro

Publicado por José (35 intervenciones) el 19/05/2020 06:07:26
Muchísimas gracias por tu ayuda José. Mira que no caí en cuenta que también tengo que hacer coincidir estos sismos:

1
sis_add={'Loma Prieta E-W';'Mexico';'Loma Prieta N-S' };

Del cual tendría que extraer del arreglo sismos, el siguiente arreglo

1
2
3
4
5
r =
  3×1 cell array
    {'loma_ew.txt'}
    {'mexico_n.txt' }
    {'loma_ns.txt' }

Disculpa la molestia.
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 JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Buscar texto en un arreglo y compararlo con otro

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 19/05/2020 06:15:42
Estimado puede hacer los ajustes a la respuesta que le hemos ofrecido para que la salga las segunda pregunta planteada.
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
sin imagen de perfil
Val: 918
Bronce
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Buscar texto en un arreglo y compararlo con otro

Publicado por Daniel (354 intervenciones) el 19/05/2020 15:32:31
Hola,

Un problema interesante, ya que no existe una regla fija para generar los nombres de los archivos lo mejor es usar métodos estadísticos para saber cual es el nombre de archivo más próximo al nombre original. En este caso se podría aplicar la distancia de Levenshtein, existiendo una implementación que se ha publicado en el blog de Cleve Moler.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function d = levm(s,t)
% Levenshtein distance between strings, matrix implementation.
% levr(s,t) is the number of deletions, insertions,
% or substitutions required to transform s to t.
% https://en.wikipedia.org/wiki/Levenshtein_distance
 
    s = char(s);
    t = char(t);
    m = length(s);
    n = length(t);
    D = zeros(m+1,n+1);
    D(:,1) = (0:m)';
    D(1,:) = (0:n);
    for i = 1:m
        for j = 1:n
            c = s(i) ~= t(j); % c = 0 if chars match, 1 if not.
            D(i+1,j+1) = min([D(i,j+1) + 1
                              D(i+1,j) + 1
                              D(i,j)  +  c]);
        end
    end
    d = D(m+1,n+1);
end

Así el problema se puede plantear como obener el nombre de archivo tiene una menor distancia y al nombre original para asignar un nombre de achivo a un mobre. Así creo que una solución puede ser: No he quitado la extensión del archivo porque es la misma para todos, pero en casos mas complejos es más fiable quitarla.

1
2
3
4
5
6
7
8
sismos = {'elcentro.txt','armenia.txt','mexico_n.txt','paez.txt','loma_ew.txt','loma_ns.txt','loma_ver.txt'};
sis_add = {'El Centro', 'Armenia', 'Loma Prieta E-W', 'Mexico', 'Loma Prieta N-S'};
 
for i = 1:length(sis_add)
    [~, p] = min(cellfun(@(x)levm(sis_add{i},x), sismos));
 
    fprintf('Para "%s" el archvio es: "%s"\n', sis_add{i}, sismos{p})
end

1
2
3
4
5
6
Para "El Centro" el archvio es: "elcentro.txt"
Para "Armenia" el archvio es: "armenia.txt"
Para "Loma Prieta E-W" el archvio es: "loma_ew.txt"
Para "Mexico" el archvio es: "mexico_n.txt"
Para "Loma Prieta N-S" el archvio es: "loma_ew.txt

Ten en cuenta que el método es estadistico, por lo que en algunos casos puede obtner un falso positivo, pero en todos los ejemplos funciona bien.

Por cierto, hace poco han introducido una función en Text Analytics Toolboox que calcula la distancia entre dos cadenas de texto, que también se puede usar para resolver el problema.

Saludos,
Daniel Rodríguez
Analytics Lane
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
sin imagen de perfil
Val: 65
Ha aumentado su posición en 2 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Buscar texto en un arreglo y compararlo con otro

Publicado por José (35 intervenciones) el 20/05/2020 00:55:25
Daniel y José fueron muy amables y pertinentes con sus ayudas, voy a acomodar las ayudas al código en el que estoy trabajando.

Saludos desde Armenia, Colombia.
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
sin imagen de perfil
Val: 65
Ha aumentado su posición en 2 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Buscar texto en un arreglo y compararlo con otro

Publicado por José (35 intervenciones) el 21/05/2020 15:27:11
Buen día.

Mira que de hecho si hay un falso positivo al final "Loma Prieta N-S" debería coincidir con "loma_ns.txt" y no con "loma_ew.txt".

Por otra parte me surge otro problema que si tuvieran la amabilidad me podrían ayudar a resolver. A la hora de seleccionar 3 sismos por ejemplo, se deberán leer 3 veces los archivos .txt correspondientes a cada sismos que van a tener tamaños diferentes 1 x ndatos (dependiendo el sismo). El inconveniente radica en que todos los datos de cada sismo deben entrar en una parte del código para realizar una integración numérica que ya esta programada.

Les agradecería mucho su colaboración.
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
sin imagen de perfil
Val: 918
Bronce
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Buscar texto en un arreglo y compararlo con otro

Publicado por Daniel (354 intervenciones) el 22/05/2020 11:31:51
Hola,

Pues si, para solucionarlo se puede limpiar la extensión y hacer todos los caracteres minusculas.

1
2
3
4
5
6
7
8
9
10
sismos = {'elcentro.txt','armenia.txt','mexico_n.txt','paez.txt','loma_ew.txt','loma_ns.txt','loma_ver.txt'};
sis_add = {'El Centro', 'Armenia', 'Loma Prieta E-W', 'Mexico', 'Loma Prieta N-S'};
 
sismos_ext = cellfun(@(x) x(1:end-4), sismos, 'UniformOutput', false);
 
for i = 1:length(sis_add)
    [~, p] = min(cellfun(@(x)levm(lower(sis_add{i}),x), sismos_ext));
 
    fprintf('Para "%s" el archvio es: "%s"\n', sis_add{i}, sismos{p})
end

1
2
3
4
5
Para "El Centro" el archvio es: "elcentro.txt"
Para "Armenia" el archvio es: "armenia.txt"
Para "Loma Prieta E-W" el archvio es: "loma_ew.txt"
Para "Mexico" el archvio es: "mexico_n.txt"
Para "Loma Prieta N-S" el archvio es: "loma_ns.tx

Para la segunda pregunta no se endiente bien, pero no sé si lo que se busca es algo del estilo de crear una matriz con vectores de difernete longitud.

1
2
3
4
5
6
7
8
data_1 = 1:2;
data_2 = 1:3;
 
result = zeros(4, 2);
result(1:length(data_1), 1) = data_1;
result(1:length(data_2), 2) = data_2;
 
result

1
2
3
4
5
6
result =
 
     1     1
     2     2
     0     3
     0     0
Saludos,
Daniel Rodríguez
Analytics Lane
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
sin imagen de perfil
Val: 65
Ha aumentado su posición en 2 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Buscar texto en un arreglo y compararlo con otro

Publicado por José (35 intervenciones) el 25/05/2020 06:28:57
Daniel has sido muy amable, te agradezco mucho por las colaboraciones.
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