簡體   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