我正在尝试通过使用Eigen::SparseMatrix A
初始化malloc
A.valuePtr() = static_cast<T*>(std::malloc(nnz*sizeof(T)));
A.innerIndexPtr() = static_cast<int*>(std::malloc(nnz*sizeof(int)));
但是我得到了错误
error: lvalue required as left operand of assignment
对于两个语句。如果很重要,包含这些行的函数将通过引用获取一个
Eigen::SparseMatrix<T, Eigen::RowMajor>
。谁能帮我这个?我正在使用g++ 5.2。
编辑:
valuePtr
类的函数SparseMatrix
是inline Scalar* valuePtr() { return &m_data.value(0); }
Scalar
是模板参数。 m_data
是CompressedStorage
类型的 protected 变量,其方法value(size_t i)
将引用返回到其内部数据数组的第i个成员。 inline Scalar& value(size_t i) { return m_values[i]; }
因此,我得出结论
valuePtr()
返回数组的第一个元素的地址。然后,我应该能够通过malloc为该数组分配空间。如果有人感兴趣,我会提供一个引用链接-请查看84和131之后的行。Eigen3 SparseMatrix class
最佳答案
该问题很可能是由于您尝试将对象分配给方法而引起的!
您的行等于:A.valuePtr() = Sometype_Pointer;
,A.valuePTR()
将调用对象A的Eigen::SparseMatrix::valuePTR
方法(函数)。
如果此方法返回一个指针(T* A::valuePtr()
),则返回的指针不是您想要的!该方法将返回一个右值;一个右值不是不是A中包含的指针的左值,而是指针的临时副本。
您无法直接为其分配任何内容,就像无法触摸电视屏幕上的人一样。
我正在做出一个巨大的假设,即您尝试执行上述操作,除非该方法如下所示,否则这是不可能的:
T ** Eigen::SparseMatrix::valuePTR()
{
return &T;
}
*A.valuePtr() = static_cast<T*>(std::malloc(nnz*sizeof(T)));
但是,请注意,对于c++对象,使用malloc被认为是非常过时的,像这样的一行会更正确
* A.valuePtr()= static_cast(new T [nnz]));
[编辑/]
老实说,我正在努力理解您的代码应该完成的工作。而且大多数人(包括我自己)都不会对这个“本征”类(class)感到陌生。尽管我认为您可能会非常误解应该如何使用它。
您能否提供到文档的链接,或提供有关如何创建/使用此类的示例?
[编辑2 /]
经过一些研究,我遇到了This article和This Question,是否可能需要使用MappedSparseMatrix
[编辑3 /]
inline Scalar* valuePtr() { return &m_data.value(0); }
将返回一个右值指针。这不是m_data中保存的对象,也不是内部使用的指针。它是指向现有对象的指针的临时副本,试图说“使此临时副本指向其他对象”没有任何意义。inline Scalar& value(size_t i) { return m_values[i]; }
在这种情况下,该方法返回对对象的引用,引用不是指针-(尽管&
通常会使人们感到困惑)。引用可以理解为原始对象,您无需取消引用。考虑以下。
int A;
int * A_p = &A;
int & A_r = A;
int & A_r_2 = *A_p;
//de-reference the pointer (to create a reference)
*A_p = 10; //A == 10
//Assign directly to A (via the reference)
A_r = 12; // A == 12
//assign directy to A (via the reference to A, that was taken from A_p
A_r_2 = 15; // A == 15
//attempt to de-reference a reference
*A_r = 10; //ERROR, A_r is not a pointer.
简而言之,返回的引用不是指向对象(已经存在)的指针,而是是对象。这将允许您将对象设置为某种对象,或者使用
.
运算符在该对象上调用方法,但是您无法重新分配已经存在的对象,因此是错误的。请考虑阅读本文,了解C++ understanding rvalue and lvalue中rvale和lvalue的区别