Borrar filtros
Borrar filtros

std for a growing data range

2 visualizaciones (últimos 30 días)
mick strife
mick strife el 25 de Abr. de 2014
Respondida: mick strife el 26 de Abr. de 2014
Hello :),
i am looking for an effective way to calculate following problem:
for i=1:1000
tmp=data(1:i,:);
rsStd(i)=std(tmp(:));
end
"data" is a matrix with k rows and j columns. What i dont want is to calculate the std for every column. What i would need is the std for a growing data range. By each loop step the data range for the calculation of the std grows as you can see in the code snippet.
Does anyone know probably a faster solution and could give me a hint? I am thinking something with vectorization but currently i have no idea. Many thanks!

Respuesta aceptada

Roger Stafford
Roger Stafford el 25 de Abr. de 2014
Editada: Roger Stafford el 25 de Abr. de 2014
n = (1:size(data,1))'*size(data,2);
sq = cumsum(sum(data.^2,2));
sm = cumsum(sum(data,2));
rsStd = sqrt((sq-sm.^2./n)./(n-1)); % <-- Corrected
(I'm assuming you want the unbiased version of standard deviation.)

Más respuestas (2)

Jos (10584)
Jos (10584) el 25 de Abr. de 2014
Editada: Jos (10584) el 25 de Abr. de 2014
Here is the completely vectored code for the running sample standard deviation across the rows of a matrix X:
X = ceil(10*rand(13,4)) % example data
N = cumsum(ones(size(X)),1)
S1 = cumsum(X,1)
S2 = cumsum(X.^2,1)
R = sqrt((N.*S2 - S1.^2) ./ (N.*(N-1)))
% this can be a one-liner if you insist ..
% check
k = 4 ; [R(k,:) ; std(X(1:k,:))] % the same
Use it to your advantage!

mick strife
mick strife el 26 de Abr. de 2014
Thx both! :)

Categorías

Más información sobre Random Number Generation en Help Center y File Exchange.

Productos

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by