Matlab - sustituir datos en matriz

 
Vista:
sin imagen de perfil

sustituir datos en matriz

Publicado por Juanjo (9 intervenciones) el 15/03/2014 12:04:53
Hola,

Tengo el siguiente archivo de imagen: 60 filas*120columnas*504bandas (double), necesito enmascarar los valores >7 como NaN (not a number) pero no he conseguido hacerlo. La rutina para ello es:

....

LAIrange=7;

for H = 1: nrow
for F = 1: ncol
for G = 1: nband
if im(H,F,G) > LAIrange
im(H,F,G) = 'NaN';
end
end
end
end
......

he probado de diferentes formas pero no me sustituye el valor, me da el siguiente error:

Assignment has more non-singleton rhs dimensions than non-singleton
subscripts

Error in TratDatos (line 61)
im(H,F,G) = 'NaN';

Gracias,


Juanjo
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

sustituir datos en matriz

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 15/03/2014 12:40:36
1
im(H,F,G) = NaN;



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
>> cambiar_valor_de_una_hipermatriz
 
im(:,:,1) =
 
    0.6596    0.9730
    0.5186    0.6490
 
 
im(:,:,2) =
 
    0.8003    0.4324
    0.4538    0.8253
 
 
im(:,:,1) =
 
   NaN   NaN
   NaN   NaN
 
 
im(:,:,2) =
 
   NaN   NaN
 
   NaN   NaN



Saludos.
JOSE JEREMÍAS CABALLERO
Asesorías en Matlab
programador en matlab
Servicios de programación matlab
[email protected]


http://matlabcaballero.blogspot.com

http://www.lawebdelprogramador.com/foros/Matlab/1371532-FORMA_DE_APRENDER_MATLAB.html
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

sustituir datos en matriz

Publicado por Juanjo (9 intervenciones) el 15/03/2014 13:01:23
muchas gracias, pero no se si me lo hace correctamente. Intento comprobar y em vuelve a dar error.....
....
1
2
3
4
5
6
7
8
9
10
11
12
13
LAIrange=7;
 
for H = 1: nrow
    for F = 1: ncol
        for G = 1: nband
            if im(H,F,G) > LAIrange
                im(H,F,G) = NaN;
            end
        end
    end
end
 
n=find(im=='NaN')
....

Alguna sugerencia para comprobar. Se de antemano el nº de datos que son NaN, solo necesito comprobarlo.

Gracias,

Juanjo
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

sustituir datos en matriz

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 15/03/2014 13:11:27
Alli el detalle:
este parte n=find(im==NaN) no esta en la parte que preguntas. Por esa razón pido que los usuarios suban sus códigos al foro.
Sube tu código al foro y por allí lo veo, caso contrario vamos a estar repreguntas y repreguntas y se pasa el tiempo y tu pregunta se queda sin contestar, recuerda que día a día las persona preguntas en el foro y yo voy contestando según las ultimas preguntas en el foro.


Saludos.
JOSE JEREMÍAS CABALLERO
Asesoría online y Presencial en Matlab
programador en matlab
Servicios de programación matlab
[email protected]

El correo es para servicios de programación, toda ayuda gratuita es vía foro.

http://matlabcaballero.blogspot.com

http://www.lawebdelprogramador.com/foros/Matlab/1371532-FORMA_DE_APRENDER_MATLAB.html
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

sustituir datos en matriz

Publicado por Juanjo (9 intervenciones) el 15/03/2014 13:27:00
ok, lo siento.

El codigo es:
......
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
% Imagen LAI del producto GEOV1/VGT a 0.5? de resoluciÛn espacial, ventana lat=[40:70] / lon=[20:80]
% 
% Formato: little-endian, BIL, uint8(60,120,504)
% nrow=60 (lineas correspondientes a lat 40:0.5:70)
% ncol=120 (columnas correspondientes a lon 20:0.5:80)
% nband=504 (3 * 12 meses *14 aÒos = 504 fechas diferentes cada 10 dias desde 5/01/1999 - 15/01/1999 - 25/01/1999 - ... 25/12/2012)
% 
% Fill_value=255: valores no validos (mar/ no data)
% 
% Para transformar los valores de la imagen en valores de LAI, debe utilizarse el siguiente factor de conversion:
% Scale factor=30 (LAI=imagen/30)
% 
% Valor_Maximo_LAI=7 (El rango fÌsico de LAI es 0-7. Despues de hacer la
% transformaciÛn, enmascarar valores de LAI mayores a 7 si los hubiera):NaN (not a number)
 
clear all;
 
 
addpath ('/Users/geodesman/Documents/Master Teledeteccion/Material/ATD/Info_Trabajos/TrabajoBiosfera/Datos_Matlab/prog/');
pathim='/Users/geodesman/Documents/Master Teledeteccion/Material/ATD/Info_Trabajos/TrabajoBiosfera/Datos_Matlab/';
pathres='/Users/geodesman/Documents/Master Teledeteccion/Material/ATD/Info_Trabajos/TrabajoBiosfera/Datos_Matlab/Resultados/';
 
nrow=60;
ncol=120;
nband=504;
 
% input file 
fimGEOV1=[pathim,'LAI_GEOV1_VGT_1999_2012_lat40_70_lon50_80'];
 
%convertimemos nuestra imagen en valores de reflecividad; ND a Reflectividad
%              
%factor de conversion ND a valores de LAI
facrefGEOV1=1/30;
 
 
% Leeemos la imagen y pasamos a valores de REFLECTIVIDAD
% X = multibandread(FILENAME,SIZE,PRECISION,OFFSET,INTERLEAVE,BYTEORDER)
im=multibandread(fimGEOV1, [nrow ncol nband], 'uint8', 0, 'bil','ieee-le');
 
NoVal=numel(im(im==255)); % 1058092 valores no validos (mar/ no data) 255*facrefGEOV1 
% nos dara 8.5, que es un valor >7 y se sale del Rango de LAI (0-7)
 
im=im*facrefGEOV1;
 
% Rango ha de ser 0-7. Mayores de 7 se enmascaran (NoVal)
min=min(min(min(im))); % No tengo valores negativos, min=0
max=max(max(max(im))); % El valor maximo=8.5
 
mayores7=numel(im(im>7)); % 1058092 valores por encima del rango de LAI (NoVal)
menores0=numel(im(im<0)); % Al no haber valores por debajo de 0 todos los valores 0 o <7 serán mis datosa a estudiar (2570708)
menores7=numel(im(im<7)); % 2570708. He de enmascarar el resto (1058092)
 
% break
% nrow=60;ncol=120;nband=504;
LAIrange=7;
 
for H = 1: nrow
    for F = 1: ncol
        for G = 1: nband
            if im(H,F,G) > LAIrange
                im(H,F,G) = NaN;
            end
        end
    end
end
 
n=find(im=='NaN')
% n=numel(im(im=NaN))
% k=numel(im(im=='NaN'));
break
fimLAI=[pathres,'LAI_proces'];
OUT=enviwrite1(im,fimLAI);
...............


Ahi va adjuntado lo necesario para correrlo....

Gracias,

Juanjo
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

sustituir datos en matriz

Publicado por Juanjo (9 intervenciones) el 15/03/2014 19:02:38
Con ese cambio el programa corre, pero no ha hecho el cambio a NaN....

Mi problema es sencillo pero algo no hago bien, eso es evidente:

-Leo un archivo imagen con 3628800 datos distribuidos en 60 filas, 120 columnas y 504 bandas
-Tengo que identificar los valores mayores a 7 tras aplicar un escalado a mis datos (escalado dato*(1/30)):

2570708 (0-7) y 1058092 (>7 ó 255), la suma de ambos es mi total (3628800)

-Sustituyo los valores mayores que 7 a NaN
-Compruebo en la misma rutina si lo hace bien y no es así. Por algun motivo no me pasa a NaN
-Genero un archivo de salida con los cambios; escalado y sustitución de datos>7 (1)

He hecho otra rutina (que adjunto) para cargar el archivo generado (1) y comprobar este cambio y observo que no es así.
Aedemas de que se han variado lel nº de valores en los dos casos; (0-7) es ahora 746976 y (>7 ó 255) pasa a ser 2881824

Ya no se que hago mal, porque aun estando mal la sustitución a NaN el numero de valores en uno y otro caso deberían ser los mismos.....

....
clear all;


addpath ('/Users/geodesman/Documents/Master Teledeteccion/Material/ATD/Info_Trabajos/TrabajoBiosfera/Datos_Matlab/prog/');
% pathim='/Users/geodesman/Documents/Master Teledeteccion/Material/ATD/Info_Trabajos/TrabajoBiosfera/Datos_Matlab/';
pathim='/Users/geodesman/Documents/Master Teledeteccion/Material/ATD/Info_Trabajos/TrabajoBiosfera/Datos_Matlab/Resultados/';

nrow=60;
ncol=120;
nband=504;

% input file
% fimGEOV1=[pathim,'LAI_GEOV1_VGT_1999_2012_lat40_70_lon50_80'];
fimLAI=[pathim,'LAI_proces'];

%convertimemos nuestra imagen en valores de reflecividad; ND a Reflectividad
%
%factor de conversion ND a valores de LAI
% facrefGEOV1=1/30;


% Leeemos la imagen y pasamos a valores de REFLECTIVIDAD
% X = multibandread(FILENAME,SIZE,PRECISION,OFFSET,INTERLEAVE,BYTEORDER)
im=multibandread(fimLAI, [nrow ncol nband], 'uint8', 0, 'bil','ieee-le');

% NoVal=numel(im(im==255)); % 1058092 valores no validos (mar/ no data) 255*facrefGEOV1
% nos dara 8.5, que es un valor >7 y se sale del Rango de LAI (0-7)

% im=im*facrefGEOV1;

% Rango ha de ser 0-7. Mayores de 7 se enmascaran (NoVal)
minR=min(min(min(im))); % No tengo valores negativos, min=0
maxR=max(max(max(im))); % El valor maximo=8.5

mayores7R=numel(im(im>7)); % 1058092 valores por encima del rango de LAI (NoVal)
menores0R=numel(im(im<0)); % Al no haber valores por debajo de 0 todos los valores 0 o <7 serán mis datosa a estudiar (2570708)
menores7R=numel(im(im<=7)); % 2570708. He de enmascarar el resto (1058092)
.......


Gracias de nuevo,

Juanjo
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

sustituir datos en matriz

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 16/03/2014 12:40:03
No debes decir que pregunta es sencilla. De ser sencillo es relativo.
Sino cambia entonces debe ser que ninguno de tus entradas de tu matriz im() es mayor que LAIrange
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

sustituir datos en matriz

Publicado por Juanjo (9 intervenciones) el 16/03/2014 13:43:40
Hola de nuevo,

Si, si hay valores mayores de 7 en mis entradas.

Antes de entrar al 'for' hago la comprobación de los valores menores o iguales a 7, si tengo por debajo de 0 y los que son mayores a 7. De lo que deduzco que si tengo y que la sustitución es incorrecta.

Saludos,

Juanjo
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

sustituir datos en matriz

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 16/03/2014 15:46:15
usa adecuadamente esta función addpath(). La forma como estas usando estas limitando que tu programa solo funcione en una sola pc o laptop, razón por la cual no he ejecutado tu código. No uses direcciones fijas. No es recomendable.
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

sustituir datos en matriz

Publicado por Juanjo (9 intervenciones) el 16/03/2014 17:19:44
OK, adjunto la carpeta y el codigo que funciona en cualquier maquina.

Codigo: TratDatos.m; rutina principal y TratDatos_comp.m; rutina para comprobar que el archivo generado es correcto.

Gracias,

Juanjo
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

sustituir datos en matriz

Publicado por Juanjo (9 intervenciones) el 19/03/2014 19:12:47
Nadie ha tenido este problema o ve el fallo?

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