Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;特征库:固定大小矩阵的转换_C++_Templates_Eigen - Fatal编程技术网

C++ C++;特征库:固定大小矩阵的转换

C++ C++;特征库:固定大小矩阵的转换,c++,templates,eigen,C++,Templates,Eigen,以下问题: template<int nDim> void foo ( ){ Eigen::Matrix<double, nDim, nDim> bar; if ( nDim == 3 ){ bar = generate_a_special_3x3_Matrix();} else if ( nDim == 2 ){ bar = generate_a_special_2x2_Matrix();} // ...

以下问题:

template<int nDim>
void foo ( ){

    Eigen::Matrix<double, nDim, nDim> bar;

    if ( nDim == 3 ){
        bar = generate_a_special_3x3_Matrix();}
    else if ( nDim == 2 ){
        bar = generate_a_special_2x2_Matrix();}


// ... further math here 
}
模板
void foo(){
特征::矩阵条;
如果(nDim==3){
bar=生成一个特殊矩阵(;)
否则如果(nDim==2){
bar=生成一个特殊矩阵(;)
//…这里有进一步的数学
}
因此,当然由于静态断言的原因,这段代码不会编译。 但是,可以保证在运行时不会出现问题

目前已知的解决方案是通过.block(3,3)或通过Ref(参见)分配的

.分段法:

template<int nDim>
void foo ( ){

    Eigen::Matrix<double, nDim, nDim> bar;

    if ( nDim == 3 ){
        bar.block(3,3) = generate_a_special_3x3_Matrix();}
    else if ( nDim == 2 ){
        bar.block(2,2)  = generate_a_special_2x2_Matrix();}


// ... further math here 
}
模板
void foo(){
特征::矩阵条;
如果(nDim==3){
bar.block(3,3)=生成特殊矩阵(;)
否则如果(nDim==2){
bar.block(2,2)=生成_a_特殊_2x2_矩阵()}
//…这里有进一步的数学
}
然而,这两种方法都涉及到运行时检查矩阵大小是否正确,这并不是必需的,而且编写的代码也不是很漂亮

我并不真正关心运行时的开销(尽管避免它会很好),但是在我看来,编写的代码并不是很干净,因为.block()的意图对其他人来说不是很清楚。 是否有更好的方法,例如演员阵容

编辑:发布了两个很好的解决方案(如果是constexpr),但是,我需要一个与C++11/14兼容的方法

您可以从C++17使用,根据条件的值,如果值为
true
,则放弃语句false(如果存在),否则放弃语句true;这样代码就不会导致编译错误。e、 g

template<int nDim>
void foo () {

    Eigen::Matrix<double, nDim, nDim> bar;

    if constexpr ( nDim == 3 ) {
        bar = generate_a_special_3x3_Matrix();
    } else constexpr if ( nDim == 2 ) {
        bar = generate_a_special_2x2_Matrix();
    }

    // ... further math here 
}
然后

模板
void foo(){
特征::矩阵条;
bar=生成一个特殊矩阵();
//…这里有进一步的数学
}
您可以从C++17使用,根据条件的值,如果值为
true
,则放弃语句false(如果存在),否则放弃语句true;这样代码就不会导致编译错误。e、 g

template<int nDim>
void foo () {

    Eigen::Matrix<double, nDim, nDim> bar;

    if constexpr ( nDim == 3 ) {
        bar = generate_a_special_3x3_Matrix();
    } else constexpr if ( nDim == 2 ) {
        bar = generate_a_special_2x2_Matrix();
    }

    // ... further math here 
}
然后

模板
void foo(){
特征::矩阵条;
bar=生成一个特殊矩阵();
//…这里有进一步的数学
}

如果您使用的是C++17,您可以编写

if constexpr ( nDim == 3 ){ bar = generate_a_special_3x3_Matrix();}
等等。但通过模板化
生成特殊矩阵
函数,您可以轻松实现与C++03兼容的解决方案:

// general declaration (without implementation):
template<int nDim>
Eigen::Matrix<double, nDim, nDim> generate_a_special_nxn_Matrix();
template<>
Eigen::Matrix<double, 2, 2> generate_a_special_nxn_Matrix(){
    return generate_a_special_2x2_Matrix();
}
template<>
Eigen::Matrix<double, 3, 3> generate_a_special_nxn_Matrix(){
    return generate_a_special_3x3_Matrix();
}
//一般声明(未实施):
样板
特征::矩阵生成特殊矩阵();
样板
特征::矩阵生成_a_特殊_nxn_矩阵(){
返回生成_a_特殊_2x2_矩阵();
}
样板
特征::矩阵生成_a_特殊_nxn_矩阵(){
返回生成_a_特殊_3x3_矩阵();
}
然后直接打电话

template<int nDim>
void foo ( ){

    Eigen::Matrix<double, nDim, nDim> bar = generate_a_special_nxn_Matrix<nDim>();

    // ... further math here 
}
模板
void foo(){
特征::矩阵条=生成特殊矩阵();
//…这里有进一步的数学
}

如果您使用的是C++17,您可以编写

if constexpr ( nDim == 3 ){ bar = generate_a_special_3x3_Matrix();}
等等。但通过模板化
生成特殊矩阵
函数,您可以轻松实现与C++03兼容的解决方案:

// general declaration (without implementation):
template<int nDim>
Eigen::Matrix<double, nDim, nDim> generate_a_special_nxn_Matrix();
template<>
Eigen::Matrix<double, 2, 2> generate_a_special_nxn_Matrix(){
    return generate_a_special_2x2_Matrix();
}
template<>
Eigen::Matrix<double, 3, 3> generate_a_special_nxn_Matrix(){
    return generate_a_special_3x3_Matrix();
}
//一般声明(未实施):
样板
特征::矩阵生成特殊矩阵();
样板
特征::矩阵生成_a_特殊_nxn_矩阵(){
返回生成_a_特殊_2x2_矩阵();
}
样板
特征::矩阵生成_a_特殊_nxn_矩阵(){
返回生成_a_特殊_3x3_矩阵();
}
然后直接打电话

template<int nDim>
void foo ( ){

    Eigen::Matrix<double, nDim, nDim> bar = generate_a_special_nxn_Matrix<nDim>();

    // ... further math here 
}
模板
void foo(){
特征::矩阵条=生成特殊矩阵();
//…这里有进一步的数学
}

要优雅地坚持使用c++98,您可以滥用语法:

模板
void foo(){
特征::矩阵条;

如果(N==3)bar要优雅地使用c++98,您可能会滥用语法:

模板
void foo(){
特征::矩阵条;

如果(N==3)bar Ok,您将比我快一分钟(对于模板化解决方案)很好的解决方案,谢谢;但是,我更愿意坚持GCC 4.8?@macmallow第二种解决方案的问题是什么?第二种解决方案很好,但它在某种程度上隐藏了外部函数中的实际操作,并且不清楚generate_a_special_Matrix()中会发生什么。好吧,你比我快了一分钟(对于模板化解决方案)很好的解决方案,谢谢;但是,我更愿意坚持GCC 4.8?@macmallow第二个解决方案有什么问题?第二个解决方案很好,但它在某种程度上隐藏了外部函数中的实际操作,并且不清楚generate_a_special_Matrix()中会发生什么。谢谢,你的C++03可以,但是,它隐藏了实际操作,因此不适合当前情况。C++17方法很好,但我需要坚持GCC 4.8。谢谢,你的C++03可以,但是,它隐藏了实际操作,因此不适合当前情况。C++17方法是很好,但我需要坚持GCC 4.8。在当前情况下的完美解决方案!谢谢!在当前情况下的完美解决方案!谢谢!