[英]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循环,假设您有三个数组: columnIndices
, rowIndices
和values
,其长度均为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.