- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试编写一个简单的数据分析程序,但我在计算十元素数组的标准差时遇到了问题
我们应该使用平方近似 (stddev = sqrt(meanofsquares/90-squareofmeans900)) 而不是标准方法,但我得到的数字几乎是随机的。
为了计算总和,我正在使用以下函数
void rms(int *mc, float &Sum, float &Sum2){ //restituisce
Sum = 0.; Sum2 = 0.;
for(int i = 0; i<10;i++){
Sum += (float) mc[i];
Sum2+=(float)mc[i]*mc[i];}
}
如下调用
flux[idep]=((float) mc[4]+ mc[5])*.5; //anzichè dividere per 2, moltiplico per .5
rms(mc, Sum, Sum2);
errflux[idep] = 1.177 * sqrt(Sum2*div1 - (Sum1*Sum1*div2)); //notice corrective term 1.177 it's not an error
我尝试了很多方法,但我从来没有设法得到一些连贯的结果。
我附上几行数据(每行是一个 block ,应该计算中位数和标准差)和完整代码,希望对您有所帮助
Dumand.dat
1023001 998765 1109975 865876 1407325 1498650 1065880 999623 1300568 1400421
178433 438761 165001 234121 765999 999650 876500 190001 206443 180065
88951 501003 13760 21880 197550 199902 46909 54331 76008 70913
10569 15900 29761 20769 22331 20117 21555 26700 45600 37654
4535 4289 4059 4099 4300 4401 4221 4390 4101 4203
1402 1436 1420 1450 1398 1590 1360 1570 1531 1466
1693243 1653128 1837200 1433174 2329366 2480524 1764215 1654548 2152664 2317938
295337 726225 273105 387511 1267860 1654593 1450758 314484 341699 298035
147229 829246 22775 36215 326979 330872 77644 89920 125800 117400
17490 26317 49260 34376 36960 33297 35677 44193 75475 62323
7500 7099 6718 6785 7118 7284 6987 7280 6790 6961
2321 2370 2350 2398 2314 2630 2251 2600 2534 2420
完整代码是
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <fstream>
#include <iomanip>
#include <string>
#include <algorithm> //algoritmi di ordinamento
#include <unistd.h> //Useremo lo standard posix per le api per correggere delle carenze in gestione i/o del c++
using namespace std;
bool myfunct(double i, double j){return j<i;}
//funzione per calcolarci i contributi all'errore
void rms(int *mc, float &Sum, float &Sum2){ //restituisce
Sum = 0.; Sum2 = 0.;
for(int i = 0; i<10;i++){
Sum += (float) mc[i];
Sum2+=(float)mc[i]*mc[i];}
}
//ocio: usando il namespace std le funzioni del namespace ios danno errore. Calma e sangue freddo, ogni volta che ne usiamo una accanto ci sta il metodo alternativo senza usarle
int main (){
//input data
int mc[10]; //le dieci misure inerenti ad una profondità
float C[2]; // le due costanti di calibrazione
float depth[4] = {1500., 2500., 3500., 4500.}; //profondità delle misure (servono per il best fit)
float Sum, Sum2, Sum1;
//output data
float flux[4], errflux[4]; //flussi e errori alle varie profondità
float fluxb, errfluxb; //flusso e errore sul fondo dell'oceano
float bkg, errbkg; //flusso e errore sul rumore (liv del mare)
//calcoliamo ora le divisioni in modo da trasformarle in prodotti. Su programmi più pesanti questo trucco accelera un botto il tempo di esecuzione
float div1= 1./90.;
float div2 = 1./900.;
//lettura delle costanti di calibrazione
cout << "type calibration constants C1, C2 ... " << endl;
cin >> C[0] >> C[1];
float invc[2] = {1./C[0], 1./C[1]};
// external files
/* ====== */
ifstream in("DUMAND.dat");//, ios::nocreate);
if(!in){cerr << "The input file DUMAND.dat does not exist. Check path. " << endl; return -1;} //se il file non esiste, avverti e killa.
/* ====== */
//ALTERNATIVA PER L'INPUT USANDO IL POSIX
/*
if(access("DUMAND.dat", 0)==-1){ //regola i permessi di accesso a un file, la useremo per controllare l'esistenza di un file
cerr << "The input file DUMAND.dat does not exist. Check path. " << endl; return -1;} //se il file non esiste, avverti e killa.}
//altrimenti SOLO A QUESTO PUNTO dichiaro l'ifstream ecc ecc
ifstream input("DUMAND.dat");
*/
//if(access("results.dat", 0)==0){cerr << "The file results.dat already exists. Aborting operation"; return -1;}
ofstream out ("results.dat");//, ios::noreplace);
//error strings
string erreof = "Unexpected EoF at rec # ";
string errmisc = "Unexpected error reading rec # ";
//loop over PMs
for (int ipm = 0; ipm < 2; ipm++){
int nrec;
//loop over depths
for (int idep = 0; idep < 4; idep++){
nrec = 6*ipm + idep+1;
//loop for reading from file
for (int i=0; i < 10; i++){
in >> mc[i];
if (in.eof()){cerr << erreof << nrec << endl;
return -1;}
if (in.bad()){
cerr << errmisc << nrec << endl;
return -1;}
} //close acquisition loop
//compute median. Il secondo argomento è l'idirizzo dell'ultimo elemento di mc +1, il terzo il criterio //(ascendente o discendente)
sort(mc,mc+10, myfunct);
flux[idep]=((float) mc[4]+ mc[5])*.5; //anzichè dividere per 2, moltiplico per .5
rms(mc, Sum, Sum2);
// Sum2=0.;
// Sum=.1*Sum;
// for(int i =0; i<10;i++){
// Sum2+=(mc[i]-Sum)*(mc[i]-Sum);
// }
errflux[idep] = 1.177 * sqrt(Sum2*div1 - (Sum1*Sum1*div2)); //notice corrective term 1.177
cout << flux[idep] << " " << errflux[idep] << endl;
system("PAUSE");
} // close loop over depth
//bottom level analysis
++nrec;
for(int i = 0; i<10; i++){
in >> mc[i];
if (in.eof()){cerr << erreof << nrec << endl;
return -1;}
if (in.bad()){
cerr << errmisc << nrec << endl;
return -1;}
} //close acquisition loop
//per fondo e lab calcoliamo il val medio e non la mediana perchè le dist sono a code piccole
rms(mc, Sum, Sum2);
errfluxb = sqrt(Sum2*div1 - Sum*Sum * div2); //std dev bottom level
fluxb = Sum*.1; //average bottom level
//lab level analysis (noise analysis)
++nrec;
for(int i = 0; i<10; i++){
in >> mc[i];
if (in.eof()){cerr << erreof << nrec << endl;
return -1;}
if (in.bad()){
cerr << errmisc << nrec << endl;
return -1;}
} //close acquisition loop
//per fondo e lab calcoliamo il val medio e non la mediana perchè le dist sono a code piccole
rms(mc, Sum, Sum2);
errbkg = sqrt(Sum2*div1 - Sum*Sum * div2); //std dev laboratory level
bkg = Sum*.1; //average laboratory level
//compute true fluxes removing noise and compensating calibration
for(int idep=0; idep <4; idep++ ){
flux[idep]-=bkg;
flux[idep]*=invc[ipm]; //rinormalizzazione con la cost di calibrazione
errflux[idep]=(sqrt(errflux[idep]*errflux[idep] + errbkg*errbkg)) *invc[ipm];
}
fluxb -= bkg;
fluxb *= invc[ipm];
errflux[idep]=(sqrt(errfluxb*errfluxb + errbkg*errbkg)) *invc[ipm];
//best fit
float S1 = 0, SX = 0, SY = 0, SXX = 0, SXY = 0;
for (int idep =0; idep < 4; idep++){
float y = log(flux[idep]);
float erryinv = flux[idep]/errflux[idep]; //since we need 1/error, we compute it directly
erryinv = erryinv * erryinv;
S1+=erryinv;
SX += depth[idep]*erryinv;
SY += y * erryinv;
SXX = depth[idep]*depth[idep] * erryinv;
SXY = depth[idep]*y * erryinv;
}//close depth loop
float invD = 1./((S1*SXX)-(SX*SX)); //again, we define 1/D because we need it and not the original D
cout << SXX << " "<<S1 << " " << SX << " " << invD << endl << endl;
float a = (SY*SXX - SX*SXY)*invD;
float b = (S1*SXY - SX*SY)*invD;
float erra = sqrt((SXX*invD));
float errb = sqrt((S1*invD));
//true fit parameters
a = exp(a);
b = -1/b;
erra = a * erra;
errb = errb * b * b;
//table of results
string t24 = "\t \t \t " , title = "results for PM( ", tit1 = "Flux and related errors for each depth", tit2 = "flux and error at bottom level", tit3 = "fit parameters and errors";
out << t24 << title << ipm+1 << " )" << endl << endl;
out << '\t' << tit1 << endl;
out.flags(ios::scientific|ios::uppercase); //per salvare i numeri in notazione scientifica con la E maiuscola
for (int l =0; l < 4; l++){
out<<setw(11) << setprecision(4) << flux[l] << " +- " << errflux[l] << endl; //imposto il numero di caratteri da usare nella notazione scientifica (setw) e la precisione(setprecision). oss: l'argomento di setw è pari a 7 + l'arg di setprecision
}
out << endl;
out<< '\t' << tit2 << endl;
out<<setw(11) << setprecision(4) << fluxb << " +- " << errfluxb << endl;
out << endl;
out<< '\t' << tit3 << endl;
out<<setw(11) << setprecision(4) << "a = " << a << " +- " << erra << endl;
out<<setw(11) << setprecision(4) << "b = " << b << " +- " << errb << endl;
}// close pm loop
in.close();
out.close();
return 1;
}
最佳答案
好吧,你的代码中没有计算方法
应该除以 n
。
void rms(int *mc, int n, float &Sum, float &Sum2) { //restituisce
Sum = 0.;
Sum2 = 0.;
for(int i = 0; i != n; i++) {
float d = float(mc[i]);
Sum += d;
Sum2 += d*d;
}
Sum /= float(n); // !!!
Sum2 /= float(n); // !!!
}
关于C++ 计算标准差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34707338/
我的应用程序上有一个抽屉式菜单,它在桌面上运行良好,但在任何移动设备上我都看到一个丑陋的卡顿。 在 header 中,我有一个 bool 值,在单击汉堡包时将其设置为 true/false,这会将 o
在CLRS书中,自上而下的heapify构建堆的复杂度为O(n)。也可以通过反复调用插入来建立堆,其最坏情况下的复杂度为nlg(n)。 我的问题是:对于后一种方法性能较差的原因,是否有任何见解? 我问
我在所有层和输出上使用 sigmoid,得到的最终错误率为 0.00012,但是当我使用理论上更好的 Relu 时,我得到了最差的结果。谁能解释为什么会发生这种情况?我正在使用一个非常简单的 2 层实
我想计算有多少人(百分比)在我的测试中表现比我差。 这是我想要的结果: student | vak | resultaat | percentielscore ---------+-------
令人惊讶的是,使用 PLINQ 并没有在我创建的一个小测试用例上产生好处;事实上,它比通常的 LINQ 还要糟糕。 测试代码如下: int repeatedCount = 10000000;
我正在开发一个高度基于 map 的应用程序,并且我正在使用 MBXMapKit 框架(基于 MapKit 构建)以便在我的 MapView 中显示自定义 Mapbox map 图 block 而不是默
这个问题在这里已经有了答案: Is it always better to use 'DbContext' instead of 'ObjectContext'? (1 个回答) 关闭 9 年前。
我正在尝试使用 FFmpeg 进行一些复杂的视频转码(例如连接多个文件)。为此,我一直在尝试使用 filter_complex,但我注意到我之前使用普通视频过滤器看到的质量略有下降。 为了仔细检查,我
我是 R 中并行计算的新手,想使用并行包来加速我的计算(这比下面的示例更复杂)。但是,与通常的 lapply 函数相比,使用 mclapply 函数的计算时间更长。 我在我的笔记本电脑上安装了一个全新
我正在尝试使用 BERT 解决文档排名问题。我的任务很简单。我必须对输入文档进行相似度排名。这里唯一的问题是我没有标签——所以它更像是一个定性分析。 我正在尝试一系列文档表示技术——主要是 word2
如何计算两点的差?例如:(5,7) - (2,3) = (3,4) using point = boost::geometry::model::point point p1 (2, 3); point
我是 ARKit 的新手,在检查了一些示例代码后,如 https://developer.apple.com/sample-code/wwdc/2017/PlacingObjects.zip我想知道是
社区。 我正在编写一些机器学习代码,将一些数据分类。 我尝试了不同的方法,但是当我使用SVM时,我遇到了这个问题。 我有一组简单的数据(3 个类别,6 个特征),当我使用具有固定参数(C=10、gam
我只是在查看不同问题的答案以了解更多信息。我看到一个answer这表示在 php 中编写 是不好的做法 for($i=0;$i
我正在编写一个界面,我必须在其中启动 4 个 http 请求才能获取一些信息。 我用两种方式实现了接口(interface): 使用顺序 file_get_contents。 使用多 curl 。 我
我想用随机数来愚弄一下,如果 haskell 中的随机生成器是否均匀分布,因此我在几次尝试后写了下面的程序(生成的列表导致堆栈溢出)。 module Main where import System.
我在 Tensorflow 中构建了一个 LSTM 分类器(使用 Python),现在我正在做一系列基准测试来衡量执行性能。基准测试代码加载在训练期间保存的模型并针对大量输入执行它。我有一个 Pyth
不久前,我重构了单元格渲染器组件以实现性能提升(我有一个巨大的表格)。我从功能性无状态组件重构为 PureComponent。例如: import React from 'react'; import
当我改变缓冲区的大小时,我得到了无法从 BufferedReader 解释的奇怪结果。 我曾强烈期望性能会随着缓冲区大小的增加而逐渐增加, yield 递减设置相当快,此后性能或多或少会持平。但看起来
我正在尝试为 1000 个正面+负面标签的 IMDB 评论 (txt_sentoken) 和 Java 的 weka API 构建一个基于朴素贝叶斯的分类器。 由于我不知道 StringToWordV
我是一名优秀的程序员,十分优秀!