Matlab - ciclo de minimos en una matriz

   
Vista:

ciclo de minimos en una matriz

Publicado por david (7 intervenciones) el 19/01/2012 16:10:28
necesito ayuda en matlab. tengo que recorrer dos vectores y hacer que el programa guarde los mínimos datos de dichos vectores no afectando el orden de su par ordenado ( i , j ).

datos:

NDVI=[ 0.2 0.2 0.4 0.4 0.6 0.6 0.7 0.7 0.8]
TS=[30 25 27 28 24 25 29 30 27]

este es mi codigo, pero cuando quiero los datos más pequeños de la matriz sin afectar a su par ordenado ( a la columna contigua), esta
( columna contigua) se me desordena.

por favor ayuda

clc
clear all
%_______________________________________________
%---------------Vectores NDVI & TS--------------
NDVI=[0.7 0.4 0.6 0.2 0.8 0.7 0.4 0.6 0.2]'; %x
TS=[30 27 25 30 27 29 28 29 25]'; %y
%_______________________________________________
%--------vectores NDVI & TS transpuestos--------
A=reshape(NDVI,1,[]);
B=reshape(TS,1,[]);
%------------
a=A';
b=B';
%_______________________________________________
%-----------------Tabla de datos----------------
Tabla_datos=[A;B];
%------------
fprintf(' NDVI TS ');
fprintf('-------------------------------- ')
fprintf('%10.2f %10.1f ',Tabla_datos);
fprintf('-------------------------------- ')
%_______________________________________________
%----------------Largo del vector---------------
L=length(a);
fprintf('El largo del vector es: %g ',L)
fprintf('_____________________________ ')
%________________________________
%-----Gráfica de dispersión------
figure
plot(NDVI, TS, '+b')
set(gca, 'XLim', [0 1], 'XTick', 0:0.2:1,...
'YLim', [0 50], 'YTick', 0:10:50);
axis square
xlabel('NDVI')
ylabel('Ts')
title('NDVI vs. Ts')

k=1;
%--------------------------------------------
%____________________________________________
%--------ORDEN DE TABLA MENOR A MAYOR--------
tt=[NDVI TS];
%------------
%---------IDENTIFICACION DE INDICES Y--------
%---------ORDENAMIENTO DE VECTOR #1----------
[x,y]=sort(tt,1);
%--------RESULTADOS DEL ORDENAMIENTO---------
resultado=[tt(y(:,1),1),tt(y(:,1),2)];
%____________________________________________
%-------------TABLA DE DATOS-----------------
r_____NDVI______TS=resultado
%_____________________________________________

[b1,m1]=unique(tt);
matrix=[b1,m1];
re=length(b1)/2
%--------- datos mas pequeños de la matriz -------
p=reshape(b1,re,2)


debiera obtener una matriz de este tipo:

NDVI TS
[ 0.2 25
0.4 27
0.6 24
0.7 29
0.8 27 ]
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

ciclo de minimos en una matriz

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3433 intervenciones) el 19/01/2012 20:52:23
Hola
El programa que te hecho, funciona para todo tipo par de vectores de igual tamaño.
Y hace lo que tu, estas piendiendo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
clear all
NDVI=[0.7 0.4 0.6 0.2  0.3 0.8 0.7 0.4 0.6 0.2 0.9 ]'; %x 
TS=[30 27 25 30 100 27 29 28 29 25 12]'; %y 
B=[NDVI TS]
n=length(NDVI);
% ORDENAMIENTO CRECIENTE DE BURBUJA
for i=1:n
for j=1:n-i
if NDVI(j)>NDVI(j+1)
aux1=NDVI(j);
aux2=TS(j);
NDVI(j)=NDVI(j+1);
TS(j)=TS(j+1);
NDVI(j+1)=aux1;
TS(j+1)=aux2;
end
end
end
A=[NDVI,TS];
k=1;
i=1;
while i<=n-1
    if A(i,1)==A(i+1,1)
        if  A(i,2)<A(i+1,2)
        M(k,:)= A(i,:);
        else
         M(k,:)= A(i+1,:);
        end
        i=i+2;
        k=k+1;
    else
       M(k,:)= A(i,:);
       i=i+1;
        k=k+1;
    end
end
 
if A(end,1)~=A(end-1,1)
    M(end+1,:)= A(end,:);
end
A
M
 
EJECUCION
>> minimo_matriz
 
B =
 
    0.7000   30.0000
    0.4000   27.0000
    0.6000   25.0000
    0.2000   30.0000
    0.3000  100.0000
    0.8000   27.0000
    0.7000   29.0000
    0.4000   28.0000
    0.6000   29.0000
    0.2000   25.0000
    0.9000   12.0000
 
 
A =
 
    0.2000   30.0000
    0.2000   25.0000
    0.3000  100.0000
    0.4000   27.0000
    0.4000   28.0000
    0.6000   25.0000
    0.6000   29.0000
    0.7000   30.0000
    0.7000   29.0000
    0.8000   27.0000
    0.9000   12.0000
 
 
M =
 
    0.2000   25.0000
    0.3000  100.0000
    0.4000   27.0000
    0.6000   25.0000
    0.7000   29.0000
    0.8000   27.0000
    0.9000   12.0000



Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
Profesor de Metodos Numericos con Matlab
Programador en Matlab
jjcc94@hotmail.com
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

ciclo de minimos en una matriz

Publicado por david (7 intervenciones) el 19/01/2012 22:00:42
muchas gracias JOSE, espero algún día poder ser yo el que te pueda ayudar para devolver el favor.
Bendiciones
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

ciclo de minimos en una matriz

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3433 intervenciones) el 19/01/2012 22:15:21
De nada, David.

En lo que puedo, aporto algo al foro.

Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
Profesor de Metodos Numericos con Matlab
Programador en Matlab
jjcc94@hotmail.com
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

duda programa burbuja

Publicado por david (7 intervenciones) el 20/01/2012 19:56:07
hola José, sabes con una matriz pequeña me resulta muy rápido, pero lo que necesito es trabajar con dos matrices de 6 millones de datos cada una y pasarlas a vectores y luego de ello realizar un ORDENAMIENTO CRECIENTE DE BURBUJA...

clear all
NDVI=[0.7 0.4 0.6 0.2 0.3 0.8 0.7 0.4 0.6 0.2 0.9 ]'; %x
TS=[30 27 25 30 100 27 29 28 29 25 12]'; %y
B=[NDVI TS]
n=length(NDVI);
% ORDENAMIENTO CRECIENTE DE BURBUJA
for i=1:n
for j=1:n-i
if NDVI(j)>NDVI(j+1)
aux1=NDVI(j);
aux2=TS(j);
NDVI(j)=NDVI(j+1);
TS(j)=TS(j+1);
NDVI(j+1)=aux1;
TS(j+1)=aux2;
end
end
end
A=[NDVI,TS];
k=1;
i=1;
while i<=n-1
if A(i,1)==A(i+1,1)
if A(i,2)<A(i+1,2)
M(k,:)= A(i,:);
else
M(k,:)= A(i+1,:);
end
i=i+2;
k=k+1;
else
M(k,:)= A(i,:);
i=i+1;
k=k+1;
end
end

if A(end,1)~=A(end-1,1)
M(end+1,:)= A(end,:);
end
A
M

este programa sirve??
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

duda programa burbuja

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3433 intervenciones) el 20/01/2012 20:13:43
hola.
Me gustaria ver tu datos.
Si deseas envialo ami correo.
Hay veces un usuario pregunta sobre un punto, y luego quiero aplicarlo para otro punto,
en ocaciones no funciona. POr eso les pido a los usuarios del foro que pregunten exactamente lo que quieren hacer y no hagan medias preguntas.

Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
Profesor de Metodos Numericos con Matlab
Programador en Matlab
jjcc94@hotmail.com
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

duda programa burbuja

Publicado por david (7 intervenciones) el 20/01/2012 20:35:27
son imagenes satelitales las que debo pasar a matriz, ok, te las enviare a tu correo. muchas 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

duda programa burbuja

Publicado por david (7 intervenciones) el 20/01/2012 21:01:21
No te pude enviar las imagenes al correo, son muy pesadas, por tanto no se si puedes probar con rand(1000000).

te envío lo que tengo hecho hasta ahora, recordando que tu ayuda fue fundamental en este ejercicio.


clc
clear all
%____________________________________________________________
% lectura de imagen desde el computador.
xndvi=imread('C:\Users\emilia\Desktop\imagenes\NDVI_Medio.tif');
yts=imread('C:\Users\emilia\Desktop\imagenes\Ts_Medio.tif');
%____________________________________________________________
% matriz 'xndvi' transformada en vector 'NDVI'
NDVI=reshape(xndvi,1,[])';
%____________________________________________________________
% matriz 'yts' transformada en vector 'TS'
TS=reshape(yts,1,[])';
%--------------------&&&&&&&&&&&&&&&&&&&&&&&&------------------------------

%__________________________________________________________________________
%---------------------MATRIZ DATOS ORIGINALES------------------------------
MATRIZ_ORIGINAL=[NDVI TS];
n=length(NDVI);
%__________________________________________________________________________
%-----------------ORDENAMIENTO CRECIENTE DE BURBUJA------------------------
for i=1:n
for j=1:n-i
if NDVI(j)>NDVI(j+1) % si el dato anterior es mayor al que le sigue pasa
dato_mayor_1=NDVI(j); % guarda datos mayores al anterior en NDVI
dato_mayor_2=TS(j); % guarda datos mayores al anterior en TS
NDVI(j)=NDVI(j+1); % datos de NDVI iferiores en la comparación
TS(j)=TS(j+1); % datos de TS iferiores en la comparación
NDVI(j+1)=dato_mayor_1; % ordena de menor a mayor los datos de NDVI
TS(j+1)=dato_mayor_2; % ordena de menor a mayor los datos de TS
end
end
end

%__________________________________________________________________________
%-----------TABLA [NDVI ,TS] ORDENADA DE MENOR A MAYOR---------------------

A=[NDVI,TS]; % Tabla o matriz con los datos de " NDVI y TS " ordenados de menor a mayor

%__________________________________________________________________________
%-----------------------SELECCIÓN DE DATOS---------------------------------
k=1;
i=1;
while i<=n-1
if A(i,1)==A(i+1,1) % compara el dato de la primera fila sólo en la primera columna, con las siguientes filas y verifica si son iguales o no
if A(i,2)<A(i+1,2) % compara el dato de la primera fila sólo en la segunda columna, con las siguientes filas y verifica si el de la siguiente fila es mayor que el anterior.
M(k,:)= A(i,:); % guarda las filas que cumplen con la condición
else
M(k,:)= A(i+1,:); % guarda los datos mas grandes
end
i=i+2;
k=k+1;
else
M(k,:)= A(i,:); % guarda los datos que no cumplen la condición
i=i+1;
k=k+1;
end
end

if A(end,1)~=A(end-1,1) % compara el ultimo valor con el datos anterior
M(end+1,:)= A(end,:); % guarda la fila y columna de los datos que no cumplen la condición
end

%__________________________________________________________________________
%----------------------------RESULTADO-------------------------------------

MATRIZ_ORDENADA_CRECIENTE=A;
DATOS_INFERIORES=M;
MATRIZ_ORDENADA_CRECIENTE; % muestra por pantalla la matriz MATRIZ ORDENADA
fprintf('\n__________________________________\n')
DATOS_INFERIORES % muestra por pantalla la matriz DATOS INFERIORES

%__________________________________________________________________________
%-----------------ORDENAMIENTO DECRECIENTE DE BURBUJA----------------------

for i=1:n
for j=1:n-i
if NDVI(j)<NDVI(j+1) % si el dato anterior es mayor al que le sigue pasa
dato_mayor_3=NDVI(j); % guarda datos mayores al anterior en NDVI
dato_mayor_4=TS(j); % guarda datos mayores al anterior en TS
NDVI(j)=NDVI(j+1); % datos de NDVI iferiores en la comparación
TS(j)=TS(j+1); % datos de TS iferiores en la comparación
NDVI(j+1)=dato_mayor_3; % ordena de menor a mayor los datos de NDVI
TS(j+1)=dato_mayor_4; % ordena de menor a mayor los datos de TS
end
end
end

%__________________________________________________________________________
%-----------TABLA [NDVI ,TS] ORDENADA DE MENOR A MAYOR---------------------

C=[NDVI,TS]; % Tabla o matriz con los datos de " NDVI y TS " ordenados de menor a mayor

%__________________________________________________________________________
%-----------------------SELECCIÓN DE DATOS---------------------------------
k=1;
i=1;
while i<=n-1
if C(i,1)==C(i+1,1) % compara el dato de la primera fila sólo en la primera columna, con las siguientes filas y verifica si son iguales o no
if C(i,2)>C(i+1,2) % compara el dato de la primera fila sólo en la segunda columna, con las siguientes filas y verifica si el de la siguiente fila es mayor que el anterior.
P(k,:)= C(i,:); % guarda las filas que cumplen con la condición
else
P(k,:)= C(i+1,:); % guarda los datos mas grandes
end
i=i+2;
k=k+1;
else
P(k,:)= C(i,:); % guarda los datos que no cumplen la condición
i=i+1;
k=k+1;
end
end

if C(end,1)~=C(end-1,1) % compara el ultimo valor con el datos anterior
P(end+1,:)= C(end,:); % guarda la fila y columna de los datos que no cumplen la condición
end

%__________________________________________________________________________
%----------------------------RESULTADO-------------------------------------

MATRIZ_ORDENADA_DECRECIENTE=C;
DATOS_SUPERIORES=P;
MATRIZ_ORDENADA_DECRECIENTE; % muestra por pantalla la matriz MATRIZ ORDENADA
fprintf('\n__________________________________\n')
DATOS_SUPERIORES % muestra por pantalla la matriz DATOS INFERIORES

%__________________________________________________________________________
%-----------------------REGRESION MINIMOS----------------------------------
X_NDVI_1=DATOS_INFERIORES(:,1);
Y_TS_MINIMOS=DATOS_INFERIORES(:,2);
REGRESION_1=polyfit(X_NDVI_1,Y_TS_MINIMOS,1);
fprintf('__________________________________\n')
fprintf('\n REGRESION #1 DATOS INFERIORES\n')
fprintf('\n TS=%6.3f*NDVI+%7.3f\n',REGRESION_1(:,1), REGRESION_1(:,2))
%__________________________________________________________________________
%-----------------------REGRESION MAXIMOS----------------------------------
X_NDVI_2=DATOS_SUPERIORES(:,1);
Y_TS_MAXIMOS=DATOS_SUPERIORES(:,2);
REGRESION_2=polyfit(X_NDVI_2,Y_TS_MAXIMOS,1);
fprintf('__________________________________\n')
fprintf('\n REGRESION #2 DATOS SUPERIORES\n')
fprintf('\n TS=%6.3f*NDVI+%7.3f\n',REGRESION_2(:,1), REGRESION_2(:,2))
fprintf('__________________________________\n')
%--------------------------------------------------------------------------
%--------------------------------------------------------------------------
%-------------------------GRÁFICA MINIMOS----------------------------------

b=[0:0.1:1];
Xim=[b];
y=REGRESION_1(:,1).*Xim+REGRESION_1(:,2);
yy=REGRESION_2(:,1).*Xim+REGRESION_2(:,2);

%--------------------------------------------------------------------------
%--------------------------------------------------------------------------

figure

plot(xndvi, yts, '+b')
set(gca, 'XLim', [0 1], 'XTick', 0:0.2:1,...
'YLim', [0 50], 'YTick', 0:10:50);
axis square
% Gráfica de dispersión.

hold on
plot(Xim, y)

hold on
plot(Xim,yy)

%titulo de la grafica
title('Figura 1. Índice de vegetación de diferencia normalizad (NDVI), en funcion de la temperatura superficial (TS)') %titulo de la grafica
xlabel('NDVI ')
ylabel('TS ')


muchas gracias JOSE
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

duda programa burbuja

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3433 intervenciones) el 21/01/2012 17:27:43
Hola David.
Este una sugerencia.
Como tienes una buena cantidad de datos,
Utiliza programacion paralela.
Bueno tienes que investestigar sobre la programacion paralela.
Ademas supongo que sabes algoritmos, y tecnicas de programacion.
Por mi parte, estoy trantando de hacerlo en programacion paralela tu pregunta, por la cantidad de datos que tienes, porque en la programacion secuencial se tarda mucho en resolver tu problema.


Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
Profesor de Metodos Numericos con Matlab
Programador en Matlab
jjcc94@hotmail.com
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

duda programa burbuja

Publicado por david (7 intervenciones) el 23/01/2012 15:43:08
hola jose, sabes dejé el programa corriendo por mas de dos horas y no me ha tirado resultado alguno, ni un mensaje de error, lo único que me dice es " BUSY "... no se que mas podría hacer con este programa. de acuerdo a tu comentario, la programación paralela te refieres a utilizar otro compilador??...

muchas 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