Por ejemplo, tengo 5 pasos de tiempo y un valor de duración:

TimeSteps = [4, 5, 6, 7, 8, 10, 11, 12, 14, 15, 16];
Duration = [5, 3, 3];

Quiero generar automáticamente los medios entre los pasos de tiempo para cada duración. En este caso, el resultado se vería así:

Result = [mean([4, 5, 6, 7, 8]), mean([10, 11, 12]), mean([14, 15, 16])]; 

Esto conducirá a:

Result = [6, 11, 15]; 

Tengo un vector de duración de 474x1, así que necesito automatizar esto. Si alguien puede ayudar, sería genial. Gracias.

4
Bowecho 13 feb. 2015 a las 15:01

3 respuestas

La mejor respuesta

Debe aplicar la función mean a una partición de su TimeSteps que tiene los tamaños en Duration:

Partition = mat2cell(TimeSteps, 1, Duration);
Result    = cellfun(@mean, Partition)

Si eres fanático de las frases ingeniosas:

Result = cellfun(@mean, mat2cell(TimeSteps, 1, Duration));

Nota: Tenga en cuenta que esta solución se publica para los vectores de fila; cambie la llamada mat2cell para los vectores de columna.

5
13 feb. 2015 a las 12:18

Usando bsxfun s capacidad de enmascaramiento -

%// Setup mask to be used to map Timesteps values onto a 2D matrix
mask = bsxfun(@ge,Duration(:).',[1:max(Duration)]') %//'

%// Initiliaze the 2D matrix where Timesteps values would be put with NaNs
vals = nan(size(mask))
%// Now, put those values
vals(mask) = TimeSteps

%// Find mean along columns for the final output
Result = nanmean(vals,1)

Salida -

Result =
     6    11    15
3
Divakar 13 feb. 2015 a las 12:27

Se puede hacer fácilmente con accumarray. Esto funciona para vectores de fila o columna.

ind = [];
ind(cumsum(Duration(end:-1:1))) = 1;
ind = cumsum(ind(end:-1:1)); %// generate grouping index for accumarray
Result = (accumarray(ind(:), TimeSteps(:))./Duration(:)).';
4
Luis Mendo 13 feb. 2015 a las 12:23