Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.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++_Matrix_Sparse Matrix_Eigen_Triangular - Fatal编程技术网

C++ 特征空间中稀疏矩阵的和三角视图

C++ 特征空间中稀疏矩阵的和三角视图,c++,matrix,sparse-matrix,eigen,triangular,C++,Matrix,Sparse Matrix,Eigen,Triangular,使用Visual Studio 2010,我尝试使用稀疏矩阵在(中)中表达以下matlab代码: m = [1 2 3 ; 4 5 6; 7 8 9]; r = triu(m,1) + tril(m)'; 即,计算不包括对角线的方阵的上三角形和包括对角线的同一方阵的转置下三角形之和 对于这个简单的例子,结果是 1 6 10 0 5 14 0 0 9 为了在使用密集矩阵的eigen中实现这一点,我提出了以下最直接的方法(唯一不那么直观的方法是使用member方法addTo而不是+运算符): E

使用Visual Studio 2010,我尝试使用稀疏矩阵在(中)中表达以下matlab代码:

m = [1 2 3 ;
4 5 6;
7 8 9];
r = triu(m,1) + tril(m)';
即,计算不包括对角线的方阵的上三角形和包括对角线的同一方阵的转置下三角形之和

对于这个简单的例子,结果是

1 6 10
0 5 14
0 0 9
为了在使用密集矩阵的eigen中实现这一点,我提出了以下最直接的方法(唯一不那么直观的方法是使用member方法addTo而不是+运算符):

Eigen::Matrix3d dm;
dm << 1,2,3, 4,5,6, 7,8,9;
std::cout << "dm" << std::endl << dm << std::endl;

auto dsut = dm.triangularView<Eigen::StrictlyUpper>();
auto dltt = dm.triangularView<Eigen::Lower>().transpose();
std::cout << "dsut" << std::endl << dsut.toDenseMatrix() << std::endl;
std::cout << "dltt" << std::endl << dltt.toDenseMatrix() << std::endl;

// doesn't compile --> Eigen::Matrix3d dj = dsut + dltt;
// (last) error:
// error C2676: binary '+' : 'Eigen::TriangularView<_MatrixType,_Mode>' does not define this operator or a conversion to a type acceptable to the predefined operator
// with
// [
//     _MatrixType=Eigen::Matrix<double,3,3>,
//     _Mode=10
// ]

Eigen::Matrix3d dj = dsut;
dltt.addTo(dj);
std::cout << "dj" << std::endl << dj << std::endl;
但是我找不到一种方法来处理稀疏矩阵。 以下是我尝试过的:

std::vector<Eigen::Triplet<double> > triplets;
triplets.push_back(Eigen::Triplet<double>(0,0,1));
triplets.push_back(Eigen::Triplet<double>(0,1,2));
triplets.push_back(Eigen::Triplet<double>(0,2,3));
triplets.push_back(Eigen::Triplet<double>(1,0,4));
triplets.push_back(Eigen::Triplet<double>(1,1,5));
triplets.push_back(Eigen::Triplet<double>(1,2,6));
triplets.push_back(Eigen::Triplet<double>(2,0,7));
triplets.push_back(Eigen::Triplet<double>(2,1,8));
triplets.push_back(Eigen::Triplet<double>(2,2,9));

Eigen::SparseMatrix<double> sm(3, 3);
sm.setFromTriplets(triplets.begin(), triplets.end());
std::cout << "sm" << std::endl << sm << std::endl;

auto ssut = sm.triangularView<Eigen::StrictlyUpper>();
auto sltt = sm.triangularView<Eigen::Lower>().transpose();
std::cout << "ssut" << std::endl << ssut << std::endl;
std::cout << "sltt" << std::endl << sltt << std::endl;

// doesn't compile --> Eigen::SparseMatrix<double> j = ssut + sltt;
// (last) error:
// eigen\eigen\src/Core/CwiseBinaryOp.h(49): error C2752: 'Eigen::internal::cwise_promote_storage_order<LhsKind,RhsKind,LhsOrder,RhsOrder>' : more than one partial specialization matches the template argument list
// with
// [
//     LhsKind=Eigen::internal::traits<Eigen::SparseMatrix<double>>::StorageKind,
//     RhsKind=Eigen::internal::traits<Eigen::SparseMatrix<double>>::StorageKind,
//     LhsOrder=0,
//     RhsOrder=1
// ]
// eigen\src/Core/util/XprHelper.h(540): could be 'Eigen::internal::cwise_promote_storage_order<Eigen::Sparse,RhsKind,LhsOrder,RhsOrder>'
// eigen\src/Core/util/XprHelper.h(539): or       'Eigen::internal::cwise_promote_storage_order<LhsKind,Eigen::Sparse,LhsOrder,RhsOrder>'
// eigen\src/Core/EigenBase.h(41) : see reference to class template instantiation 'Eigen::internal::traits<T>' being compiled

Eigen::SparseMatrix<double> j = ssut;
// doesn't compile --> sltt.addTo(j);
// (last) error:
// eigen\src/Core/EigenBase.h(72): error C2248: 'Eigen::SparseMatrixBase<Derived>::evalTo' : cannot access private member declared in class 'Eigen::SparseMatrixBase<Derived>'
// with
// [
//     Derived=Eigen::TriangularView<const Eigen::Transpose<const Eigen::SparseMatrix<double>>,2>
// ]

std::cout << "j" << std::endl << j.toDense() << std::endl;
当一个三角形视图被转置时,+运算符和addTo-member方法似乎都不能处理这两个三角形视图

如果不转置none,则+运算符起作用,但addTo方法不起作用。用伴随替换转置会导致相同的编译错误


我有什么明显的遗漏吗?或者,有没有办法重新表述这一点?我的目标是使用现有的eigen函数,避免将稀疏矩阵转换为稠密矩阵。

主要问题是将列主稀疏矩阵添加到行主稀疏矩阵,这是禁止的,因为无法直接有效地执行此类操作。基本上,以下简单的代码段也将无法编译:

SparseMatrix<double> A,B,C;
C = A + B.transpose();

主要问题是将列主稀疏矩阵添加到行主稀疏矩阵,这是禁止的,因为无法直接有效地执行此类操作。基本上,以下简单的代码段也将无法编译:

SparseMatrix<double> A,B,C;
C = A + B.transpose();

很不错的!看起来很明显,但我没想到。很好!看起来很明显,但我没想到。
SparseMatrix<double> A,B,C;
C = A + B.transpose();
C = A + SparseMatrix<double>(B.transpose());
C = A.selfadjointView<Lower>();