最後にいくつかの検索や裁判の後、私はこの書き込みを行う方法を発見し、スパース行列を読み込みます。私の仕事は実際には比較的簡単なので、より複雑でより一般的な目的のために、この粗い方法がうまくいくかどうかわかりません。
基本的な考え方は、boost_iterator(詳細はlinkを参照)を介して、ブーストの疎行列のすべての非ゼロ要素を反復することによってofstream
に書き込むことです。 ifstream
から読んだ場合、私は貧弱な人の方法を使用しています:書き込みフォーマットに従って繰り返し読み込み、疎の行列に挿入します。ここに私のテスト目的のために私のコードは次のとおりです。
#include <iostream>
#include <fstream>
#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <boost/numeric/ublas/io.hpp>
int main(int argc, char** argv)
{
using std::cerr;
using std::cout;
using std::endl;
using namespace boost::numeric::ublas;
typedef compressed_matrix<float, row_major> cMatrix;
const size_t size = 5;
const size_t rowInd[5] = { 0, 0, 1, 2, 4 };
const size_t colInd[5] = { 0, 2, 0, 4, 4 };
cMatrix sparseMat(size,size);
for (size_t i=0; i<size; ++i)
sparseMat.insert_element(rowInd[i], colInd[i], 1.0);
cout << sparseMat << endl;
// Try writing to file
std::ofstream ofsDat("temp.dat", std::ios::out | std::ios::binary);
for(cMatrix::const_iterator1 rowIter = sparseMat.begin1(); rowIter != sparseMat.end1(); ++rowIter) {
for(cMatrix::const_iterator2 colIter = rowIter.begin(); colIter != rowIter.end(); ++colIter) {
ofsDat << " " << colIter.index1() << " " << colIter.index2() << " " << *colIter;
} // end for colIter
} // end for rowIter
ofsDat.close();
cout << "Writing ended, starting to read" << endl;
// Try reading the file
cMatrix sparseMat_2(size, size);
std::ifstream ifsDat("temp.dat", std::ios::in | std::ios::binary);
size_t rowTemp, colTemp;
float valTemp;
while(!ifsDat.eof()) {
ifsDat >> rowTemp >> colTemp >> valTemp;
cout << "row " << rowTemp << " column " << colTemp << " value " << valTemp << endl;
sparseMat_2.insert_element(rowTemp, colTemp, valTemp);
}
cout << sparseMat_2 << endl;
return 0;
}
私はこれを行うには良い、または標準的な方法があるかどうかはわからない、セパレータなどのデータの間にスペースを追加しましたか?どんなフィードバックも高く評価されます!
お返事ありがとうございました!私はすでに、この "読み書き"がメモリのチャンクを直接管理する方法で行うことができると私の古い考え方を諦めました。だから、私は「要素ごとに読み書きする」ことを考えていました。あなたの例はまさにこれを行います。私の唯一の懸念は、M個の非ゼロを持つ疎次元行列(NxN)の場合、2つのループを実行する複雑さはN^2ですが、この書き込み操作は実際には非ゼロ要素へのMアクセスを必要とします。それで、すべての非ゼロ要素を効率的に反復する方法はありますか? – YangLou
私はこのリンクを見つけました[リンク](http://stackoverflow.com/questions/1795658/looping-over-the-non-zero-elements-of-a-ublas-sparse-matrix)すべての非ゼロを通過するために、すべての要素(非ゼロとゼロ)を反復処理するには?または私はここに何かを逃していますか? – YangLou
こんにちは@ヤングロー。私はプロファイラで確認していないが、私の推測では、ファイルを書いてゼロを埋めるので、データを得ることはボトルネックにとってあまり重要ではないということです。私は速く、疎な行列で、行列の計算に適用可能であると信じています。 – lakeweb