简短版本:我想知道标准三角函数的实现是否比包含的更快math.h
.
龙版本:我有一个程序,对NUMERICS相当重(这是一个物理模拟),并需要调用三角函数,主要是sin
和cos
,有很多.目前我只是使用其中包含的实现math.h
.分析显示对这些函数的调用花费比我预期的要多(希望).
虽然代码的其他部分肯定有足够的优化空间,但速度更快sin
,cos
可能会给我一些额外的百分比..那么,你们有什么建议吗?
在另一篇文章中,建议使用自制的查找表.但也许有其他选择?或者在一些图书馆中提供现成且经过良好测试的查找解决方
我想使用AMS包在Latex中对齐一些方程.每个等式都有两个需要对齐的等号.所以有一些东西
A = B = C
D = E = F
Run Code Online (Sandbox Code Playgroud)
我试过像这样使用对齐环境
\begin{align}
A &= B &= C \\
D &= E &= F
\end{align}
Run Code Online (Sandbox Code Playgroud)
这原则上是有效的(它对齐),但它在每行的第二个等号之前增加了可笑的大空间.但我只想让该行运行,好像没有额外的对齐选项卡.只有当我用"BBB"代替"B"时,我才希望"F"之前的等号向右移动确切的空间量.
任何人都可以帮助我吗?这让我疯狂,因为我不知道这种奇怪的行为,我找不到任何解决方案.也许alignat可能会有所帮助,但我并没有真正了解该环境的工作原理或它与正常对齐方式的区别.
干杯,奥利弗
我想将一个函数应用于表的特定列.对(mxn)表的第i列说.实际上我只想用该标量将该列中的所有元素相乘,但一般函数的应用也可以.
它可能只需要一些Map或MapAt命令,可能与Transpose结合使用以应用于行而不是列 - 但我无法找出用于寻址整个列(或行)的正确语法.
任何提示都将受到高度赞赏.
我有一个具有以下结构的项目
^/project/trunk
^/project/branches/mybranch
Run Code Online (Sandbox Code Playgroud)
当前HEAD是修订版1048.分支是从r523中的trunk复制的.trunk已合并到mybranch,结果为r1048.mergeinfo on ^/project/branches/mybranch
给出
/project/trunk:523-1047
Run Code Online (Sandbox Code Playgroud)
并且trunk的mergeinfo没有记录提及任何内容^/project/branches/mybranch
.实际上实际上,主干和分支也从并行的分支中保持mergeinfos,mybranch
但是这两个mergeinfos在两个输出中看起来完全相同.
现在我进入我的干线工作副本并尝试发布
svn merge --reintegrate ^/project/branches/myproject
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息:
svn: Reintegrate can only be used if revisions 523 through 1048 were previously merged from file:///home/svn/project/trunk to the reintegrate source, but this is not the case:
project/branches/mybranch/src
Missing ranges: /project/trunk/src:523-1047
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为我的分支文件夹上的mergeinfo告诉我523-1047已经从主干到分支正确合并.这个子文件夹的处理是什么?src
是一个显然存在于trunk和branch中的目录.
我认为这是有些可疑的地方.如果我查看mybranch/src的mergeinfo,svn pg svn:mergeinfo ^/project/branches/mybranch/src@HEAD
我什么也得不到.如果我看看trunk/src但是(svn pg svn:mergeinfo ^/project/trunk/src@HEAD
)我得到了
/project/branches/mybranch/src:784
Run Code Online (Sandbox Code Playgroud)
所以似乎有人在那里从一个分支到另一个分支做了一个樱桃挑选.但是,这不会出现在trunk文件夹中.
那是麻烦所在吗?最重要的是:我该怎样治愈它?
我有一个CMake项目,包括和链接两个库,说A
和B
(实际上它超过两个,其中一个是增强的东西,但这在这里并不重要).两者都通过FindSomething.cmake
脚本(正确)填充标准CMake变量来定位,包括通过添加目录
INCLUDE_DIRECTORIES(${A_INCLUDE_DIRS})
INCLUDE_DIRECTORIES(${B_INCLUDE_DIRS})
Run Code Online (Sandbox Code Playgroud)
后来通过连接完成
TARGET_LINK_LIBRARIES(mytarget ${A_LIBRARIES} ${B_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
现在,问题是这两个库可以驻留在基于用户的位置或系统目录中(顺便说一句,我是在linux上,CMake 2.8.2) - 或两者兼而有之.假设A
只是in $HOME/usr/include
和$HOME/usr/lib
while B
(在我的情况下是boost)驻留在系统路径(/usr/include
和/usr/lib
)和基于用户的路径中 - 在不同的版本中.可以使用查找脚本查找系统或基于用户的库B
,这是有效的.
当我想B
从系统路径链接时,麻烦就开始了.${B_INCLUDE_DIRS}
并${B_LIBRARIES}
正确指向标头和库的系统范围位置.但仍有${A_INCLUDE_DIRS}
一点指向非系统包含目录,最终还会B
从此位置获取库的标题,而链接则B
使用系统路径(via ${B_LIBRARIES}
)中的版本,这会导致冲突,即链接错误.
改变INCLUDE_DIRECTORIES
语句的顺序似乎没有任何改变.我通过nm --line-numbers
目标文件检查了导致链接错误的符号的来源.
我能做什么?有诀窍吗?
${A_INCLUDE_DIRS}
来自A
和${B_INCLUDE_DIRS}
来自所有标头的所有标头B
?我想在各种地方使用模板化的typedef,以及其自身模板化函数的声明.这是我目前的尝试
template<typename T>
struct type{ typedef std::vector<T> sometype; }
template<typename TT>
void someFunction( type<TT>::sometype& myArg );
Run Code Online (Sandbox Code Playgroud)
(注意,这std::vector<T>
只是一个例子).这不起作用,并给出编译器错误"void someFunction'的模板声明".我已经发现我需要把一个typename
放在前面type<TT>
,即
template<typename TT>
void someFunction( typename type<TT>::sometype& myArg );
Run Code Online (Sandbox Code Playgroud)
作品.但是这个解决方案 - 至少可以说 - 有点笨重.还有替代品吗?
假设我有一个N维boost :: multi_array(为了简单起见,类型为int),其中N
在编译时已知但可以变化(即,是非类型模板参数).让我们假设所有尺寸都具有相同的尺寸m
.
typedef boost::multi_array<int, N> tDataArray;
boost::array<tDataArray::index, N> shape;
shape.fill(m);
tDataArray A(shape);
Run Code Online (Sandbox Code Playgroud)
现在我想循环所有条目A
,例如打印它们.如果N是2,例如我想我会写这样的东西
boost::array<tDataArray::index, 2> index;
for ( int i = 0; i < m; i++ )
{
for ( int j = 0; j < m; j++ )
{
index = {{ i, j }};
cout << A ( index ) << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
我已经使用索引对象来访问元素,因为我认为这比[] -operator更灵活.
但是如何在不知道尺寸数量的情况下编写这个N
.有没有内置的方式?multi_array的文档对于存在哪种类型的迭代器等不是很清楚.或者我是否必须使用自定义指针,计算指针指针等自定义方法?如果是这样 - 任何建议这样的算法是什么样的?
假设我有一个A
依赖于库B
和目标的目标C
.但是B
并C
没有相互依赖.与CMake的链接看起来像
target_link_libraries( A B C )
Run Code Online (Sandbox Code Playgroud)
但
target_link_libraries( A B )
target_link_libraries( A C )
Run Code Online (Sandbox Code Playgroud)
似乎也有效(并且可能更容易维护).是否存在将target_link_libraries命令拆分为多个命令的缺点?或者,如果一个人最终确实遇到了图书馆的相互依赖,那么是否应该总是把它放在一个命令中?
我想将英特尔编译器icc(或icpc)与基于CMake的项目一起使用(在Linux上用于它的价值).我当然可以在调用cmake时导出CXX变量,例如
CXX=icpc cmake ../
Run Code Online (Sandbox Code Playgroud)
这很好用.但是,我想通过自定义选项提供此选择.为此,我解析自定义选项,例如
cmake -DMY_COMPILER_OPTION=Intel ..
Run Code Online (Sandbox Code Playgroud)
如
IF (MY_COMPILER_OPTION STREQUAL "Intel")
MESSAGE(STATUS "** Compiling with Intel settings **")
SET(CMAKE_CXX_COMPILER "icpc")
SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -w")
SET(CMAKE_CXX_FLAGS_DEBUG "-g")
ENDIF ()
Run Code Online (Sandbox Code Playgroud)
并CMAKE_CXX_COMPILER
与一些编译器标志一起设置.这也有效,但有一个重要的"但是".
我还想在使用-ipo
icc编译时使用选项(过程间优化)代码,我需要在构建过程中编译静态库.要做到这一点,我需要使用英特尔xiar
(xilink
我也猜).
cmake实际上为此提供了一个特殊的属性
set_property(TARGET mytarget PROPERTY INTERPROCEDURAL_OPTIMIZATION 1)
Run Code Online (Sandbox Code Playgroud)
但是,当通过环境变量设置编译器(然后使用xiar)时,这似乎只能正常工作.通过CMAKE_CXX_COMPILER
此属性设置编译器时将被忽略.
还有另一种方法吗?一些推荐的方式?或者至少是解决方案?
我有一个简单的cmake项目(在linux上)从自定义位置加载一些库.我现在想使用英特尔编译器而不是gnu编译器,并在我的CMakeLists.txt中添加一些if语句,根据所使用的编译器类型加载不同的库.
所以我会在cmake配置时通过CXX环境变量指定英特尔编译器的使用情况(这是正确的吗?).然后,我需要一个if语句
IF ( INTEL_IS_USED )
BLA BLA
ELSE
BLA BLA
Run Code Online (Sandbox Code Playgroud)
最简单的方法是什么?特别是,是否有一些变量我可以查询编译器类型以及它对英特尔编译器的价值是什么?
干杯,奥利弗
我有一个函数,它接受一个指向自定义类对象的指针(实际指向一个基类,这样多态就起作用).然而,在调用例程中,该对象仅用于该调用的目的,即是临时的.例如这样:
class A { /** stuff */ };
class B : public A { /** stuff */ };
void doSomething( const A* const _p ) { /** stuff */ }
void callingRoutine()
{
A* tempPointer = new B;
doSomething( tempPointer );
delete tempPointer;
}
Run Code Online (Sandbox Code Playgroud)
现在,因为我真的只需要类型的对象B
的通话中doSomething
,有没有办法做到这一点的一条线?干
doSomething( new B );
Run Code Online (Sandbox Code Playgroud)
造成内存泄漏(valgrind如此说).或者会
doSomething( &B );
Run Code Online (Sandbox Code Playgroud)
是推荐的方式?后者编译但会发出有关将指针传递给临时对象的警告.这就是我想要的,但这样安全吗?