Matlab - Seleccionar subgrupo de elementos de un vector

   
Vista:

Seleccionar subgrupo de elementos de un vector

Publicado por Francisco (11 intervenciones) el 08/08/2011 14:51:29
Hola a todos!
Imaginad que tengo un vector x de 100 elementos. Mi objetivo es el siguiente:
quiero ir comparando cada elemento de x, con la media de los 40 valores que lo rodean (20 por arriba y 20 por abajo).
Es decir, para el caso del x(50) quiero compararlo con la media de x(30)+..+x(49)+x(51)...+x(70)/40.
Para el caso de los elementos que estén cerca de los límites, por ejemplo x(2) sería la media del valor que tiene por arriba x(1) junto con los 20 que tiene por debajo, es decir,
x(1)+x(3)+...+x(22)/21


Gracias!
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

Seleccionar subgrupo de elementos de un vector

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3433 intervenciones) el 08/08/2011 17:24:24
hola.
Tengo dos preguntas por el momento.
1). todo los elementos del vector X son diferentes de cero?.
2) todo los elementos del vector X son diferentes o algunos de ellosse pueden repetir ?.

saludos.
JOSE JEREMIAS CABALLERO
ASESOR DE PROYECTOS CON MATLAB
PROFESOR DE METODOS NUMERICOS CON MATLAB
PROGRAMADOR 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

Seleccionar subgrupo de elementos de un vector

Publicado por Francisco (11 intervenciones) el 08/08/2011 18:04:05
Hola José Jeremias:

1) Todos los elementos son distintos de cero
2) Se podría repetir alguno, pero es realmente dificil. Aunque es mejor considerar que podemos tener alguna repetición.

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
Imágen de perfil de JOSE JEREMIAS CABALLERO

Seleccionar subgrupo de elementos de un vector

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3433 intervenciones) el 08/08/2011 18:13:46
Hola
He hecho un programa donde estoy considerando que ninguno de los elementos es cero.
Hay maneras de hacerlo, via bucles o via vectorial. Yo te he via vectorial.
%=================================
clear all;
clc,
x=rand(1,50);
display(x)
nvalores=8;
display(nvalores);
elemento=3;
display(3);
valor_elemento=x(elemento);
n=length(x);
X=[zeros(1,n) x zeros(1,n)];
v=[X(n+elemento-nvalores:+n+elemento-1) X(elemento+1+n:elemento+nvalores+n)];
t=find(v~=0);
V=v(t);
display(V)
media=mean(V);
display(media)
%========================================

saludos.
JOSE JEREMIAS CABALLERO
ASESOR DE PROYECTOS CON MATLAB
PROFESOR DE METODOS NUMERICOS CON MATLAB
PROGRAMADOR 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
Imágen de perfil de JOSE JEREMIAS CABALLERO

Seleccionar subgrupo de elementos de un vector

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3433 intervenciones) el 08/08/2011 18:34:11
hola.
Hice unos arreglos al programa anterior.
%=================================
clear all;
x=rand(1,10);
display(x)
nvalores=8;
display(nvalores);
elemento=3;
display(elemento);
valor_elemento=x(elemento);
n=length(x);
X=[zeros(1,n) x zeros(1,n)];
v=[X(n+elemento-nvalores:+n+elemento-1) X(elemento+1+n:elemento+nvalores+n)];
t=find(v~=0);
V=v(t);
display(V)
media=mean(V);
display(media)
%============================
EJECUCION

>> comparar_valores
x =
0.9394 0.9809 0.2866 0.8008 0.8961 0.5975 0.8840 0.9437 0.5492 0.7284


nvalores =
8


elemento =
3


V =
0.9394 0.9809 0.8008 0.8961 0.5975 0.8840 0.9437 0.5492 0.7284


media =
0.8133


>> comparar_valores
x =
0.5768 0.0259 0.4465 0.6463 0.5212 0.3723 0.9371 0.8295 0.8491 0.3725

nvalores =
8

elemento =
3

V =
0.5768 0.0259 0.6463 0.5212 0.3723 0.9371 0.8295 0.8491 0.3725


media =
0.5701

saludos.
JOSE JEREMIAS CABALLERO
ASESOR DE PROYECTOS CON MATLAB
PROFESOR DE METODOS NUMERICOS CON MATLAB
PROGRAMADOR 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

Seleccionar subgrupo de elementos de un vector

Publicado por Antonio (11 intervenciones) el 09/08/2011 11:33:24
Hola José Jeremias,
he estado pensando en lo que te pregunté. Al final creo que lo he conseguido, echa un vistazo:


function [M]=mediamovil(X,n)
M=zeros(0,length(X));
for w=1:length(X)

if w<1+n
M(w)=(sum(X(1:w+n))-X(w))/(length(X(1:w+n))-1);
end
if w>=1+n && w<=length(X)-n
M(w)=(sum(X(w-n:w+n))-X(w))/(length(X(w-n:w+n))-1);
end
if w>length(X)-n
M(w)=(sum(X(w-n:length(X)))-X(w))/(length(X(w-n:length(X)))-1);
end
end


Muchas gracias José J. !!!
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

Seleccionar subgrupo de elementos de un vector

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3433 intervenciones) el 09/08/2011 15:46:30
Hola Antonio.
Primeramente darte las gracias por compartir tu programa que haz hecho.
De ese manera aprendemos mucho mas de este hermoso mundo de la programacion.
Me dio mucho gusto ver tu programa.
Solo una pregunta, ¿como lo ejecutas?
en el texto function [M]=mediamovil(X,n)
Veo que tu vector datos es X, pero que significa n.
y M que debe arrojar?.
Podrias poner la ejecucion de tu programa si fueras tan amable.
De esa manera cualquiera persona que entre al foro vea tu programa y quiera ejecutarlo no va a tener problema.

saludos.
JOSE JEREMIAS CABALLERO
ASESOR DE PROYECTOS CON MATLAB
PROFESOR DE METODOS NUMERICOS CON MATLAB
PROGRAMADOR 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

Seleccionar subgrupo de elementos de un vector

Publicado por Antonio (11 intervenciones) el 10/08/2011 09:23:57
Claro José Jeremias!!
Ahí va:
X, es el vector sobre el que calcularemos la media movil
n, es el grado de la media movil.
M, es el resultado. Es decir la media movil que buscamos.

>> X=(1:10);
>> n=3;
>> [M]=filtro2(X,n)

M =

Columns 1 through 3

3.000000000000000e+000 3.250000000000000e+000 3.600000000000000e+000

Columns 4 through 6

4.000000000000000e+000 5.000000000000000e+000 6.000000000000000e+000

Columns 7 through 9

7.000000000000000e+000 7.400000000000000e+000 7.750000000000000e+000

Column 10

8.000000000000000e+000

Saludos a todos!
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

Seleccionar subgrupo de elementos de un vector

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3433 intervenciones) el 10/08/2011 17:30:17
hola Antonio.
He estado probando tu programa con varios tamaños del vector X.
cuando X toma 5 valores, y n toma el valor de 3, me salió lo siguiente:
%=========================
>> X=1:5;n=3; [X,M]=mediamovil(X,n)
??? Index exceeds matrix dimensions.

Error in ==> mediamovil at 19
M(w)=(sum(X(1:w+n))-X(w))/(length(X(1:w+n))-1);
%========================================

Mi duda es, ¿cual debe ser la menor cantidad de elementos que puede tener el vector X?.
saludos.
JOSE JEREMIAS CABALLERO
ASESOR DE PROYECTOS CON MATLAB
PROFESOR DE METODOS NUMERICOS CON MATLAB
PROGRAMADOR 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

Seleccionar subgrupo de elementos de un vector

Publicado por Antonio (11 intervenciones) el 11/08/2011 09:23:21
Hola José Jeremias,
efectivamente para esos casos da problemas. Este programa yo lo necesito para pasarlo a vectores de unos 8000 datos y tomando valores de n=40. Por tanto, nunca me daria ese fallo.
No obstante, está bien introducir esa posibilidad para que quede mas preciso.
Concretamente la condicion necesaria para que no haya fallos es que length(X)>2*n-1
Entonces añadiendo:

function [M]=mediamovil(X,n)
if length(X)<=2*n-1
error('La longitud de X es insuficiente para relizar una media móvil con el rango seleccionado')
end

M=zeros(0,length(X));
for w=1:length(X)

if w<1+n
M(w)=(sum(X(1:w+n))-X(w))/(length(X(1:w+n))-1);
end
if w>=1+n && w<=length(X)-n
M(w)=(sum(X(w-n:w+n))-X(w))/(length(X(w-n:w+n))-1);
end
if w>length(X)-n
M(w)=(sum(X(w-n:length(X)))-X(w))/(length(X(w-n:length(X)))-1);
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
Imágen de perfil de JOSE JEREMIAS CABALLERO

Seleccionar subgrupo de elementos de un vector

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3433 intervenciones) el 11/08/2011 16:25:52
Hola Antonio.

%===============================
function [x,M]=mediamovil1(x,nvalores)
n=length(x);
if n>=nvalores && n>=2
X=[zeros(1,n) x zeros(1,n)];
for elemento=1:length(x)
v=[X(n+elemento-nvalores:+n+elemento-1),X(elemento+1+n:elemento+nvalores+n)];
M(elemento)=mean(v(v~=0));
end
else
M={'El grado de media movil y longitud del vector x deben ser >= 2';
'Ademas el valor de media movil debe ser <= que la longitud de x'};
end
%================================

EJECUCIONES
>> X=1:10;nvalores=6;[x,M]=mediamovil1(X,nvalores)
x =
1 2 3 4 5 6 7 8 9 10
M =
4.5000 4.8571 5.2500 5.6667 5.5556 5.4444 5.3333 5.7500 6.1429 6.5000


>> X=1:4;nvalores=4;[x,M]=mediamovil1(X,nvalores)
x =
1 2 3 4
M =
3.0000 2.6667 2.3333 2.0000


>> X=1:2;nvalores=4;[x,M]=mediamovil1(X,nvalores)
x =
1 2
M =
'El grado de media movil y longitud del vector x deben ser >= 2'
'Ademas el valor de media movil debe ser <= que la longitud de x'


>> X=1:2;nvalores=2;[x,M]=mediamovil1(X,nvalores)
x =
1 2

M =
2 1

>> X=1:1;nvalores=1;[x,M]=mediamovil1(X,nvalores)
x =
1
M =
'El grado de media movil y longitud del vector x deben ser >= 2'
'Ademas el valor de media movil debe ser <= que la longitud de x'


JOSE JEREMIAS CABALLERO
ASESOR DE PROYECTOS CON MATLAB
PROFESOR DE METODOS NUMERICOS CON MATLAB
PROGRAMADOR 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