将特征的稀疏矩阵添加到特征的张量
Add an Eigen's SparseMatrix to an Eigen's Tensor
如何将本征稀疏矩阵添加到本征张量?
以下代码(无法编译)解释了我正在尝试做的事情。
#include <iostream>
#include <Eigen/Sparse>
#include <unsupported/Eigen/CXX11/Tensor>
using Eigen::Tensor;
using Eigen::SparseMatrix;
int main()
{
Tensor<double, 2> tensor(10, 10);
for(int i=0; i < 10; i++) {
for(int j=0; j < 10; j++) {
tensor(i, j) = i * 10 + j;
}
}
SparseMatrix<double> sparse(10, 10);
auto tensor2 = tensor;
tensor2 += sparse;
std::cout << tensor2 << std::endl;
}
显然,这没有实现。您必须自己为这两种类型重载 operator+=
。请参阅 this table for the correct signature. See also »Iterating over the nonzero coefficients « in the Eigen docs 了解如何有效地迭代稀疏矩阵。
#include <iostream>
#include <Eigen/Sparse>
#include <unsupported/Eigen/CXX11/Tensor>
using Eigen::Tensor;
using Eigen::SparseMatrix;
template < typename T >
Tensor<T,2>& operator+=(Tensor<T,2>& lhs, SparseMatrix<T> const& rhs)
{
for (int k = 0; k < rhs.outerSize(); ++k)
for (typename SparseMatrix<T>::InnerIterator it(rhs,k); it; ++it)
lhs(it.row(), it.col()) = it.value();
return lhs;
}
int main()
{
Tensor<double, 2> tensor(10, 10);
for(int i=0; i < 10; i++) {
for(int j=0; j < 10; j++) {
tensor(i, j) = i * 10 + j;
}
}
// We want a sparse matrix that is not only zeros
Eigen::MatrixXd m = Eigen::MatrixXd::Zero(10,10);
m(0,0) = 1;
SparseMatrix<double> sparse(10, 10);
sparse = m.sparseView();
auto tensor2 = tensor;
tensor2 += sparse;
std::cout << tensor2 << std::endl;
}
您的意思是在 +=
方法中:
lhs(it.row(), it.col()) += it.value();
而不是
lhs(it.row(), it.col()) = it.value();
?
如何将本征稀疏矩阵添加到本征张量?
以下代码(无法编译)解释了我正在尝试做的事情。
#include <iostream>
#include <Eigen/Sparse>
#include <unsupported/Eigen/CXX11/Tensor>
using Eigen::Tensor;
using Eigen::SparseMatrix;
int main()
{
Tensor<double, 2> tensor(10, 10);
for(int i=0; i < 10; i++) {
for(int j=0; j < 10; j++) {
tensor(i, j) = i * 10 + j;
}
}
SparseMatrix<double> sparse(10, 10);
auto tensor2 = tensor;
tensor2 += sparse;
std::cout << tensor2 << std::endl;
}
显然,这没有实现。您必须自己为这两种类型重载 operator+=
。请参阅 this table for the correct signature. See also »Iterating over the nonzero coefficients « in the Eigen docs 了解如何有效地迭代稀疏矩阵。
#include <iostream>
#include <Eigen/Sparse>
#include <unsupported/Eigen/CXX11/Tensor>
using Eigen::Tensor;
using Eigen::SparseMatrix;
template < typename T >
Tensor<T,2>& operator+=(Tensor<T,2>& lhs, SparseMatrix<T> const& rhs)
{
for (int k = 0; k < rhs.outerSize(); ++k)
for (typename SparseMatrix<T>::InnerIterator it(rhs,k); it; ++it)
lhs(it.row(), it.col()) = it.value();
return lhs;
}
int main()
{
Tensor<double, 2> tensor(10, 10);
for(int i=0; i < 10; i++) {
for(int j=0; j < 10; j++) {
tensor(i, j) = i * 10 + j;
}
}
// We want a sparse matrix that is not only zeros
Eigen::MatrixXd m = Eigen::MatrixXd::Zero(10,10);
m(0,0) = 1;
SparseMatrix<double> sparse(10, 10);
sparse = m.sparseView();
auto tensor2 = tensor;
tensor2 += sparse;
std::cout << tensor2 << std::endl;
}
您的意思是在 +=
方法中:
lhs(it.row(), it.col()) += it.value();
而不是
lhs(it.row(), it.col()) = it.value();
?