[英]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.