Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何创建动态平均值?(不知道怎么称呼它)_Matlab - Fatal编程技术网

Matlab 如何创建动态平均值?(不知道怎么称呼它)

Matlab 如何创建动态平均值?(不知道怎么称呼它),matlab,Matlab,我有一个10000x1矩阵。我需要找出每个案例中包含的信息百分比。这样做的方法是制作另一个包含剩余单元格之和的矩阵 例如: % info is a 10000x1 % info_n contains percentages of information. info_n = zeros([10000 1]); info_n(1)= info(1) /sum(info); info_n(2)=(info(1)+info(2)) /sum(info);

我有一个10000x1矩阵。我需要找出每个案例中包含的信息百分比。这样做的方法是制作另一个包含剩余单元格之和的矩阵

例如:

% info is a 10000x1
% info_n contains percentages of information.


info_n = zeros([10000 1]);
info_n(1)= info(1)                 /sum(info);
info_n(2)=(info(1)+info(2))        /sum(info);
info_n(3)=(info(1)+info(2)+info(3))/sum(info);
我需要这样做,但一直到信息10000

到目前为止,我尝试了以下方法:

for i = 1:10000

info_n(i)=(info(i))/sum(info);   

end
但是我想不出一个方法来添加以前的信息。谢谢你的帮助

您可以使用此任务的累积总和:

info_n = cumsum(info)/sum(info);
编辑:@LuisMendo的评论激起了我的好奇心。如果向量的长度N小于2^15,那么通过使用他的方法,你似乎真的获得了一些东西,但是之后的优势下降了。这是因为cumsum可能需要^2,但sum只需要准时

在左边,您可以看到两种方法的时间以及时间与大小对数的比率。在右侧,您可以看到实际的绝对时间差,这取决于当前正在运行的其他程序,差异很大:

测试脚本:
也许效率更高一点:info\n=cumsuminfo;信息=信息/信息能;为了确保您可能应该使用timeit,它接受一个函数句柄。它应该更准确我不认为这里的准确性如此重要,因为重复处决之间的差异要大得多。好吧,时间恰恰应该考虑到这一点。但我不知道这有多准确
N = 2.^(1:28);
y1 = zeros(size(N));
y2 = zeros(size(N));
vec = 1:numel(N);
for k=vec;
    disp(k)
    info = zeros(N(k),1);
    % flawr's suggestion
    tic
    info_n = cumsum(info);
    info_n = info_n / info_n(end);
    y1(k) = toc;
    % LuisMendo's suggestion
    tic
    info_m = cumsum(info)/sum(info);
    y2(k) = toc;
end
subplot(1,2,1)
semilogy(vec,y1,vec,y2,vec,y1./y2,vec,vec.^0);
legend('LuisMendo','flawr','LM/f','Location','SouthEast');
subplot(1,2,2)
plot(vec,y1-y2)