繁体   English   中英

C ++-MATLAB:逐块更新稀疏矩阵

[英]C++ - MATLAB : updating a Sparse Matrix blockwise

Matlab代码在这里

 N = 4096;
 x       =   linspace(-1,1,N);     
 A = sparse(100000,100000); 
 index = 1:32;

 A(index,index)    =   kernel(x(index),x(index));
  //kernel here outputs a 32 x 32 matrix 

我必须将MATLAB代码转换为C ++,但是我被困在稀疏函数中,我尝试使用:

 N=4096;
 Eigen::VectorXd x = Eigen::VectorXd::LinSpaced(N,-1,1); 
 Eigen::SparseMatrix<double> A(Asize,Asize);
 A.block(1,1,index.size(), index.size()) = Kernel();

但是SparseMatrix具有作为只读功能,因此对于更新矩阵无用。

另一点:

我浏览了Eigen文档并检查了SparseMatrix声明的另一种形式:

 typedef Eigen::Triplet<double> T;
 std::vector<T>tripleList;
 tripleList.reserve(nnz);

 for(...)
 {
  // ...
  tripletList.push_back(T(i,j,v_ij));   //?? what are these values?
  }
 A.setFromTriplets(tripleList.begin(), tripleList.end());

但是我不明白nnz的值是什么,应该是我从Matlab代码中获得的值,以及应该通过for循环推送什么值? 它们是随机的吗,考虑到矩阵大小太大,我该如何选择“推入值”。

另外,最后一个问题仍然是,声明后的稀疏矩阵将如何逐块更新?

通常,本征稀疏矩阵块是常量。 唯一的例外规则如m.col(i)一列主要矩阵或.row(i)在一排大一个。

至于第二点, nnz是非零的数量。 通过指定矩阵在开始时需要保持多少个非零值,可以在构造稀疏矩阵时最大程度地减少所需的重新分配/副本数量。 请参阅文档 另外,请注意,如果您知道每列中需要多少个元素,则其他重载也是有用的。 关于for循环,假设您有三个数组: columnIndicesrowIndicesvalues ,其长度均为nnz 您的for循环如下所示:

for(int i = 0; i < nnz; i++)
{
    tripletList.push_back(T(columnIndices[i], rowIndices[i], values[i]));
}

或者,您可以计算for循环中每个三元组的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM