gpt4 book ai didi

C++-MATLAB : updating a Sparse Matrix blockwise

转载 作者:搜寻专家 更新时间:2023-10-31 01:32:48 25 4
gpt4 key购买 nike

此处为 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 具有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 循环推送什么值?它们是随机的吗?鉴于矩阵大小如此之大,我如何选择“插入值”。

还有最后一个问题,声明后的稀疏矩阵如何逐 block 更新?

最佳答案

一般来说,Eigen稀疏矩阵 block 是const的。此规则的异常(exception)情况是例如m.col(i) 在列主矩阵中或 .row(i) 在行主矩阵中。

关于你的第二点,nnz 是非零的个数。通过在开始时指定矩阵需要保留多少个非零值,可以最大限度地减少构造稀疏矩阵时所需的重新分配/复制的数量。查看documentation .另外,请注意 other overload如果您知道每一列中需要多少个元素,这将很有用。关于 for 循环,假设您有三个数组:columnIndicesrowIndicesvalues,长度均为 nnz。你的 for 循环看起来像:

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

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

关于C++-MATLAB : updating a Sparse Matrix blockwise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42550586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com