std for a growing data range
2 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
mick strife
le 25 Avr 2014
Réponse apportée : mick strife
le 26 Avr 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!
0 commentaires
Réponse acceptée
Roger Stafford
le 25 Avr 2014
Modifié(e) : Roger Stafford
le 25 Avr 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.)
0 commentaires
Plus de réponses (2)
Jos (10584)
le 25 Avr 2014
Modifié(e) : Jos (10584)
le 25 Avr 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!
0 commentaires
Voir également
Catégories
En savoir plus sur Random Number Generation dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!