草庐IT

c++ - C 与 C++ 的数值模拟(性能)

我即将编写一个离格扩散受限聚合(DLA)模拟,我想知道是使用C还是C++。出于设计原因,C++会很好,但我想知道C是否会执行得更好。我当然知道算法的性能,并选择了最好的算法。所以我不是在谈论将O(n^2)改进为O(logn)或类似的东西。可以这么说,我正在尝试减少常数。如果您不知道DLA,它基本上可以归结为拥有一个double组(大小在10^3和10^6之间),并在一个循环中选择随机double来比较(大于/小于)大部分数组。因此,对此重要的性能差异是数据访问和调用函数:数据访问:C结构与具有公共(public)数据成员的C++类与具有私有(private)数据成员和访问器的C++类。

c++ - 如何将 Rcpp::List 转换为 std::vector<double>

我是R语言领域的新手,但我需要在我的C++代码中通过irlba计算奇异值分解。为此,我使用RInside库。RInsideR(argc,argv);std::stringcmd="S现在我需要将带有奇异vector的Rcpp::List的结果转换为std::vector问题:将执行svd的结果转换为std::vector的最佳方法是什么?如何将写为std::vector的输入矩阵转换为适合将其用作irlba中svd函数的输入参数的格式? 最佳答案 要从C++类型转换为R对象,您可以使用wrap.我通常构造NumericMatrix的

c++ - 在定义明确的函数参数列表中传递未初始化的变量吗?

我有一些代码基本上可以归结为以下内容:voidbar(boolb,doublef){if(b){doubleg=f;}}voidfoo(){doublef;boolb=false;bar(b,f);}这里有没有未定义的行为?我怀疑可能是因为我在将f传递给bar时获取了未初始化的double的值拷贝。也就是说,我没有使用传递的double,因为ifblock将不会运行。此外,如果我通过引用传递double是否一切都很好:voidbar(boolb,double&f)那么我不是在“使用”一个未初始化的变量,而只是引用它。 最佳答案 是的

c++ - 在 opencv 中索引矩阵的最佳方法

比方说,A和B是相同大小的矩阵。在Matlab中,我可以使用如下所示的简单索引。idx=A>0;B(idx)=0如何在OpenCV中执行此操作?我应该只使用for(i=0;...rows)for(j=0;...cols)if(A.at(i,j)>0)B.at(i,j)=0;是这样的吗?有没有更好(更快、更有效)的方法?此外,在OpenCV中,当我尝试Matidx=A>0;变量idx似乎是一个CV_8U矩阵(不是bool值而是整数)。 最佳答案 您可以轻松转换此MATLAB代码:idx=A>0;B(idx)=0;//sameasB(A

c++ - 为什么允许在 noexcept 标记的函数中抛出异常?

我很难理解这一点。doublecompute(doublex,doubley)noexcept{if(y==0)throwstd::domain_error("yiszero");returnx/y;}这在clang中编译得很好(我没有检查gcc),但对我来说这似乎是胡说八道。为什么编译器会允许noexcept函数包含throw语句? 最佳答案 将发生的是std::terminate()被触发,因为您的异常规范不允许发生这种情况(参见[except.spec/9])。至于为什么允许这样做,根本不可能彻底检查是否有任何违反规范的地方。

c++ - double 和 NaN 的比较结果是什么?

我有以下程序:#include#includeintmain(){doublea=1;doubleb=nan("");std::coutb)a)输出:00一般来说,从nan的含义-notanumber可以明显看出,任何对nan的操作本质上都是毫无意义的。从我在互联网上找到的IEEE-754我发现如果在FPU中至少有一个操作数是nan结果也是nan,但是如上例所示,我没有发现正常值与nan之间的比较。标准是怎么说的? 最佳答案 Whatdoesstandardsayaboutit?C++标准没有说明对NaN的操作如何运作。它未指定。因

c++ - 用于实时信号处理的快速 C++ 正弦和余弦替代方案

我需要实现一个实时同步正交检测器。检测器接收输入数据流(来自PCIADC)并返回谐波w的幅度。有简化的C++代码:doubleLowFreqFilter::process(doublein){avg=avg*a+in*(1-a);returnavg;}classQuadroDetect{doublewt;constdoublewdt;LowFreqFilterlf1;LowFreqFilterlf2;QuadroDetect(constdoublew,constdoubledt):wt(0),wdt(w*dt){}inlinedoubleprocess(constdoublein){d

c++ - 查找浮点类型可以在不损失精度的情况下处理的最大整数大小

Double的范围大于64位整数,但由于其表示形式,其精度较低(因为double也是64位,它不能容纳更多的实际值)。因此,当表示较大的整数时,您会开始失去整数部分的精度。#include#includetemplatevoidmaxint_to_double(){Ti=std::numeric_limits::max();TFloatd=i;std::cout();maxint_to_double();maxint_to_double();return0;}这打印:21474836472147483647.000000922337203685477580792233720368547

G++ 4.5 中 std::complex 的 C++11 复制赋值 - 与 'operator+' 不匹配

下面的代码无法使用-std=c++0x开关在g++4.5.0版中编译。我收到以下错误消息:error:nomatchfor'operator+'in'std::pow[with_Tp=float,_Up=int,typename__gnu_cxx::__promote_2::__type=double](((conststd::complex&)((conststd::complex*)(&x))),((constint&)((constint*)(&2))))+y'我相信这与提到的可分配要求有关here.我应该为complex定义自己的复制赋值运算符吗?如果是,怎么办?#includ

c++ - 将表示二维数组的 std::vector<std::vector <double>> 转换为 cv::Mat

将std::vector的嵌套std::vector转换为cv::Mat的最优雅和最有效的方法是什么>?嵌套结构包含一个数组,即所有内部std::vector具有相同的大小并表示矩阵行。我不介意将数据从一个复制到另一个。我知道一个单一的、非嵌套的std::vector很容易,有一个构造函数:std::vectormyvec;cv::Matmymat;//fillmyvecboolcopy=true;myMat=cv::Mat(myvec,copy);嵌套vector呢? 最佳答案 我的变体(需要OpenCV2.4):intsize=