【发布时间】:2020-02-09 02:31:23
【问题描述】:
我需要计算一个向量的累积方差。我尝试构建和编写脚本,但是这个脚本需要太多时间来计算我的大小为 1*100000 的向量的累积方差。你知道是否有更快的方法来找到这个累积方差?
这是我正在使用的代码
%%Creation of the rand vectors. ans calculation of the variances
d=100000; %dimension of the vectors
nv=6 %quantity of vectors
for j=1:nv;
VItimeseries(:,j)=rand(d,1); % Final matrix with vectors
end
%% script to calculate the cumulative variance in the columns of my matrix
VectorVarianza=0;
VectoFinalVar=0;
VectorFinalTotalVAriances=zeros(d,nv);
for k=1:nv %number of columns
for j=1:numel(VItimeseries(:,k)) %size of the rows
Vector=VItimeseries(:,k);
VectorVarianza(1:j)= Vector(1:j); % Vector to calculate the variance...
...Independently
VectorFinalVar(j,k)= var(VectorVarianza);%Calculation of variances
end
VectorFinalTotalVAriances(:,k)=VectorFinalVar(:,k)% construction of the...
...Final Vector with the cumulative variances
end
【问题讨论】:
-
VectorFinalVar(j,k)=很昂贵,因为数组没有预先分配。为什么不直接写到VectorFinalTotalVAriances?Vector=VItimeseries(:,k);应该从j的循环中移出,这是不必要的重复。这些更改将大大加快代码速度。但最后你使用的是 O(n^2) 算法,其中 O(n) 是可能的:不要在每个子数组上使用var,而是在移动时累积 sum(x) 和 sum(x^2)通过数组,然后使用它们来计算方差。您可以使用cumsum来计算没有显式循环的那些。 -
@CrisLuengo 你是绝对正确的。我想知道,Matlab 没有这个计算方差的命令。我正在尝试使用命令 movvar(A, 100000) 检查,其中 100000 是计算方差的滑动窗口。但它没有给我预期的结果。:)
标签: matlab for-loop variance cumulative-sum