将特征稀疏矩阵添加到特征张量

Add an Eigen's SparseMatrix to an Eigen's Tensor

本文关键字:特征 添加 张量      更新时间:2023-10-16

如何将特征的sparsematrix添加到特征的张量?

以下代码(未编译(解释了我要做的事情。

#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+=超载。请参阅此表以获取正确的签名。另请参阅»在非零系数上迭代«在特征文档中如何有效迭代稀疏矩阵。

#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();