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
Templates 有没有一种方法可以;强迫;MatrixBase::对模板函数参数进行求值?_Templates_Objective C++_Eigen_Vmat - Fatal编程技术网

Templates 有没有一种方法可以;强迫;MatrixBase::对模板函数参数进行求值?

Templates 有没有一种方法可以;强迫;MatrixBase::对模板函数参数进行求值?,templates,objective-c++,eigen,vmat,Templates,Objective C++,Eigen,Vmat,我正在为一个广泛使用Eigen的库编写代码,并经常将Eigen::Matrix对象映射到我自己设计的NSObject子类(vMAT_Array)。使用库通常需要将矩阵编组到vMAT_数组实例中,以便它们可以传递,等等 我有一个vMAT_casttemplate函数来处理这个问题: template <typename EigenObjectType> vMAT_Array * vMAT_cast(EigenObjectType matrix) { return Map<

我正在为一个广泛使用Eigen的库编写代码,并经常将
Eigen::Matrix
对象映射到我自己设计的
NSObject
子类(
vMAT_Array
)。使用库通常需要将矩阵编组到
vMAT_数组
实例中,以便它们可以传递,等等

我有一个
vMAT_cast
template函数来处理这个问题:

template <typename EigenObjectType>
vMAT_Array * vMAT_cast(EigenObjectType matrix)
{
    return Map<EigenObjectType>(matrix).matA;
}

我怀疑有模板fu会“强迫”MatrixBase::eval发生,但我对此缺乏了解。有谁能给我点化一下吗?

你可以在egen/unsupported/egen/OpenGLSupport模块中找到这种模板功夫。在这里,您将找到OpenGL函数的包装器,这些函数通过原始C指针获取向量和矩阵。关键是在这个测试中,我们检查表达式类型是否与OpenGL兼容:

bool IsGLCompatible =  bool(XprType::Flags&LinearAccessBit)                                              
                    && bool(XprType::Flags&DirectAccessBit)                                               
                    && (XprType::IsVectorAtCompileTime || (XprType::Flags&RowMajorBit)==0)
LinearAccessBit表示没有“跨步”,DirectAccessBit表示有.data()可用。另外两个是显而易见的,可能与您的情况无关


您的另一个选择(可能更简单)是使用devel分支的新Ref类。有关此方法的详细信息,请参阅。

啊,我想我看到了表达式是如何工作的……它是在编译时计算的,如果
IsGLCompatible
is
false
则有一个专门化,在调用函数之前“修复”参数。但是我不知道如何使用
Ref
模板类。假设您只能映射顺序存储的列主矩阵,然后将
vMAT_cast
函数声明为
vMAT_cast(Ref-matrix)将计算与
矩阵xD
不“相似”的任何表达式。如果
vMAT_数组
支持跨步,则将其声明为:
vMAT_cast(Ref matrix)
。感谢您的澄清……我的困难在于,我不知道库用户可能希望使用哪种类型的矩阵。我的Objective-C库试图使用
vMAT_Array*
作为“ref”类型,您可以轻松地传递函数、方法等并从中返回。因此,也许我需要在某个时候深入了解Eigen
ref
内容的源代码?但是,由于我(大部分)能够理解您概述的第一种方法是如何工作的,我想我会先尝试一下。(目前我还在到处喷洒
.eval()
/Users/Shared/Source/vMAT/vMATTests/EigenTests.mm:25:35: note: in instantiation of member function 'Eigen::DenseBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >::LinSpaced' requested here
    vMAT_Array * matM = vMAT_cast(VectorXd::LinSpaced(40, 1.0, 40.0));
                                  ^
In file included from /Users/Shared/Source/vMAT/vMATTests/EigenTests.mm:11:
In file included from /Users/Shared/Source/vMAT/vMAT/vMAT.h:51:
/Users/Shared/Source/vMAT/vMAT/vMAT_Array.h:122:82: error: no member named 'data' in 'Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<double, true>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >'
                                        data:[NSMutableData dataWithBytes:matrix.data()
                                                                          ~~~~~~ ^
bool IsGLCompatible =  bool(XprType::Flags&LinearAccessBit)                                              
                    && bool(XprType::Flags&DirectAccessBit)                                               
                    && (XprType::IsVectorAtCompileTime || (XprType::Flags&RowMajorBit)==0)