我正在寻找使用Armadillo (C++) 的专家。我是一名想成为天文学家的人,我正在尝试在望远镜的特定滤光片中计算 SSP(简单恒星群,一组化学同质和同时代的恒星)的 ab 视星等 m_ab 。
compute_ab
执行此计算的函数的输入是SSP 的波长wavelength
和相应的光谱能量分布sed
(基本上它是 SSP 在一定波长范围内每单位波长的光度);输入fresp
和fwaves
是望远镜的吞吐量(基本上是某个波段的过滤器)和吞吐量分布的相应波长范围。它们是std::vector<long double>
一维的。我需要输出的是一个数字,可能是双精度或长双精度。
我肯定需要从这些信息中计算 m_ab 是插值,因为 SED 和吞吐量可以在非常不同的波长上;它是卷积和积分。从物理上讲,我在这个函数中所做的段落是正确的,所以我请求一些帮助来使用犰狳,我做得对吗?如何将输出设置为双精度?此外,当我运行我的代码时,我现在遇到了这个错误:
error: trapz(): length of X must equal the number of rows in Y when dim=0
terminate called after throwing an instance of 'std::logic_error'
what(): trapz(): length of X must equal the number of rows in Y when dim=0
这是功能:
mat compute_ab(vector <long double> waves,vector <long double> sed, vector <long double> fwaves,vector <long double> fresp){
colvec filter_interp;
colvec csed = conv_to< colvec >::from(sed);
colvec cwaves = conv_to< colvec >::from(waves);
colvec cfwaves = conv_to< colvec >::from(fwaves);
colvec cfresp = conv_to< colvec >::from(fresp);
arma::interp1(cfwaves,cfresp,cwaves,filter_interp);
colvec filterSpec = arma::conv(filter_interp,csed);
colvec i1 = arma::conv(filterSpec, cwaves);
colvec i2 = arma::conv(filter_interp, 1./cwaves);
mat I1=arma::trapz(i1,cwaves);
mat I2=arma::trapz(i2,cwaves);
mat fnu=I1/I2/speedcunitas;
mat mAB= -2.5 * log10(fnu) -48.6;
return mAB;
}
感谢大家的帮助!