【发布时间】:2017-07-21 21:26:36
【问题描述】:
这里是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++,但我被困在 sparse 函数中,我尝试使用:
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 具有 block 作为只读函数,因此不能用于更新矩阵。
另一点:
我浏览了 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 循环推动什么值?它们会是随机的吗,鉴于矩阵大小如此之大,我如何选择“推送值”。
还有最后一个问题,声明后的稀疏矩阵如何逐块更新?
【问题讨论】:
-
nnz表示“非零的数量”。我假设这是用于 Eigen 中的内存分配。此外,`A(index,index) = kernel(x(index),x(index));` 这可以通过 C++ 中的简单双嵌套循环来完成,您不需要单行 -
根据documentaion 出于性能原因,写入子稀疏矩阵是有限的。并且只有您可以更新连续的列集。子矩阵的大小应该在编译时知道
-
@AnderBiguri 如何在双嵌套循环中完成?您是否建议使用“插入”功能?但是如果同一行重复多次,我必须每次都先存储 Kernel() 的结果,然后将其插入稀疏矩阵。
标签: c++ matlab sparse-matrix eigen