2009-01-07 19 views
11

No he podido encontrar una función en matlab u octava para hacer lo que quiero. Tengo una matriz m de dos columnas (valores xey). Sé que puedo extraer la columna haciendo m (:, 1) o m (:, 2). Quiero dividirlo en matrices más pequeñas de tamaño [potencialmente] igual y trazar el promedio de estas matrículas. En otras palabras, quiero poner los valores en contenedores basados ​​en los valores x, luego encontrar los medios de los contenedores. Siento que la función hist me debería ayudar, pero parece que no.Binning en matlab

¿Alguien sabe de una función incorporada para hacer algo como esto?

edición

Tenía la intención de mencionar que miré hist y no podía conseguir que haga lo que quería, pero debe haber deslizado mi mente.

Ejemplo: Supongamos que tengo el siguiente (Estoy tratando esto en octava, pero que yo sepa funciona en Matlab):

x=1:20; 
y=[1:10,10:1]; 
m=[x, y]; 

Si quiero 10 bandejas, me gustaría m se divida en :

m1=[1:2, 1:2] 
... 
m5=[9:10, 9:10] 
m6=[10:11, 10:-1:9] 
... 
m10=[19:20, 2:-1:1] 

y luego obtenga la media de cada contenedor.

Actualización: He publicado una pregunta de seguimiento here. Agradecería mucho las respuestas.

+0

No estoy seguro de entender su pregunta, ¿podría ilustrar lo que ¿Estás diciendo con un ejemplo? – sundar

Respuesta

19

he respondido a esto en forma de vídeo en mi blog:

http://blogs.mathworks.com/videos/2009/01/07/binning-data-in-matlab/

Aquí está el código:

m = rand(10,2); %Generate data 

x = m(:,1); %split into x and y 
y = m(:,2); 

topEdge = 1; % define limits 
botEdge = 0; % define limits 
numBins = 2; % define number of bins 

binEdges = linspace(botEdge, topEdge, numBins+1); 

[h,whichBin] = histc(x, binEdges); 

for i = 1:numBins 
    flagBinMembers = (whichBin == i); 
    binMembers  = y(flagBinMembers); 
    binMean(i)  = mean(binMembers); 
end 
+1

Muy claro y simple. Gracias. –

+2

@MatlabDoug Podría ser mejor hacer algo como topEdge = max (x); botEdge = min (x); entonces está claro de dónde provienen esos números. –