资讯详情

C++代码实现MATLAB中的geomean函数功能

📅 2026/11/4 2:25:10 | 华诺云谱 👁 阅读
C++代码实现MATLAB中的geomean函数功能
#includecmath#includevector#includestdexcept#includelimits#includeiostream#includeiomanip// 计算一组 double 的几何平均数// 行为对齐 MATLAB geomean:// - 任一元素为 0 → 返回 0// - 任一元素为负 → 返回 NaN// - 空输入 → 返回 NaNdoublegeomean_vector(conststd::vectordoublex){if(x.empty()){returnstd::numeric_limitsdouble::quiet_NaN();}doublesum_log0.0;for(doublev:x){if(v0.0){return0.0;}if(v0.0){returnstd::numeric_limitsdouble::quiet_NaN();}sum_logstd::log(v);}returnstd::exp(sum_log/static_castdouble(x.size()));}// 矩阵按列求几何平均数行优先存储// data: rows × cols 的矩阵按行优先展平// 返回长度为 cols 的 vector对应每一列的几何平均数std::vectordoublegeomean_columns(conststd::vectordoubledata,std::size_t rows,std::size_t cols){if(data.size()!rows*cols||rows0||cols0){throwstd::invalid_argument(维度不匹配或为空);}std::vectordoubleresult(cols);for(std::size_t j0;jcols;j){doublesum_log0.0;boolhas_zerofalse;boolhas_negativefalse;for(std::size_t i0;irows;i){doublevdata[i*colsj];if(v0.0){has_zerotrue;break;}if(v0.0){has_negativetrue;break;}sum_logstd::log(v);}if(has_zero){result[j]0.0;}elseif(has_negative){result[j]std::numeric_limitsdouble::quiet_NaN();}else{result[j]std::exp(sum_log/static_castdouble(rows));}}returnresult;}// 所有元素的几何平均数对应 geomean(X, all)doublegeomean_all(conststd::vectordoubledata){returngeomean_vector(data);}// data: rows × cols 矩阵列优先存储data[r c * rows]// dim 1: 沿列方向返回长度 cols// dim 2: 沿行方向返回长度 rowsstd::vectordoublegeomean_dim(conststd::vectordoubledata,std::size_t rows,std::size_t cols,intdim){if(data.size()!rows*cols){throwstd::invalid_argument(数据长度与维度不符);}if(dim1){std::vectordoubleresult(cols);for(std::size_t c0;ccols;c){doublesum_log0.0;boolzerofalse,negfalse;for(std::size_t r0;rrows;r){doublevdata[rc*rows];if(v0.0){zerotrue;break;}if(v0.0){negtrue;break;}sum_logstd::log(v);}result[c]zero?0.0:neg?std::numeric_limitsdouble::quiet_NaN():std::exp(sum_log/static_castdouble(rows));}returnresult;}if(dim2){std::vectordoubleresult(rows);for(std::size_t r0;rrows;r){doublesum_log0.0;boolzerofalse,negfalse;for(std::size_t c0;ccols;c){doublevdata[rc*rows];if(v0.0){zerotrue;break;}if(v0.0){negtrue;break;}sum_logstd::log(v);}result[r]zero?0.0:neg?std::numeric_limitsdouble::quiet_NaN():std::exp(sum_log/static_castdouble(cols));}returnresult;}throwstd::invalid_argument(dim 仅支持 1 或 2);}intmain(){std::coutstd::setprecision(10);// 向量: [1, 2, 3, 4, 5, 6]std::vectordoublev{1,2,3,4,5,6};std::coutgeomean_vector geomean_vector(v)\n;// 含 0std::vectordoublev0{1,0,3};std::cout含0 geomean_vector(v0)\n;// 含负值std::vectordoublevn{1,-2,3};doublegngeomean_vector(vn);std::cout含负 ;if(std::isnan(gn)){std::coutNaN;}else{std::coutgn;}std::cout\n;// 矩阵按列 (2×3, 行优先)std::vectordoublem{1,2,3,4,5,6};autocolsgeomean_columns(m,2,3);std::cout矩阵按列 ;for(std::size_t j0;jcols.size();j){if(j0){std::cout ;}std::coutcols[j];}std::cout\n;return0;}
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑