CUSP を使用して、Matlab から 272 x 544 の double 行列を ELLPACK 形式のスパース行列に読み込もうとしています。これまでに見つけた唯一の方法は、データを mxArray に読み込み、mxArray を double* 配列に読み込み (mxGetPr() を使用)、値を cusp::array2d にコピーすることです。そこで、array2d を .mtx ファイルに書き込み、そのファイルを coo_matrix に読み込み、最後にそれを ell_matrix に変換する必要があります。私にはばかげているように聞こえますが、CUSP のドキュメントがほとんどないことを考えると、これは私が考えることができる最高のものです。誰かがそれを行うためのより良い方法をお勧めする場合、私は非常に感謝しています.
とにかく、私が今直面している問題は、array2d のデータを読み込んで、それを cusp::write_matrix_market_file() を使用して .mtx ファイルに書き込もうとすると、「未処理の例外: 場所を書き込むためのアクセス違反」というエラー メッセージが表示されることです。 . ファイルに書き込む前に、array2d からいくつかの値を出力してみました。すべてが適切に配置され、値が array2d に正常に格納されているように見えることを確認するためです。タイプをfloatに変更してみましたが、エラーは続きます。このタスクのコードは次のとおりです。
#include <thrust/version.h>
#include <cusp/version.h>
#include <cusp/ell_matrix.h>
#include <cusp/print.h>
#include <cusp/io/matrix_market.h>
#include <cusp/array2d.h>
#include <cusp/coo_matrix.h>
int main(int argc, char** argv)
{
const mxArray* mx_g_tra;
//Reading data from Matlab
mx_g_tra = openMatFile2("C:\\out.mat", ndir, "out.tra");
double* g_tra = mxGetPr(mx_g_tra);
sizeG_tra=(int)mxGetNumberOfElements(mx_g_tra);
const mwSize* traDims= mxGetDimensions(mx_g_tra);
//get matrix dimensions
tra_W= traDims[0];
tra_H= traDims[1];
printf("\nAcquired %d TRA elements as %d x %d from Maltab.\n", sizeG_tra, tra_W, tra_H);
cusp::array2d<float, cusp::host_memory> TRA(traDims[0], traDims[1]);
if(g_tra != NULL)
{
for(int i=0; i< traDims[0]; i++)
{
for(int j=0; j<traDims[1]; j++)
{TRA(i,j) = (float)g_tra[i*traDims[1]+j];
if(TRA(i,j) != 0) printf("\nTRA(%d, %d) = %g", i, j, TRA(i,j));}
}
}
cusp::io::write_matrix_market_file(TRA, "C:\\TRA.mtx");
例外が発生した時点で、コールスタックは cusp::io::detail::write_value >,float>(std::basic_ofstream > & output={...}, const float & value=) Line を指しています116 + 0x5 バイト C++
編集:クイックアップデート:ファイル「matrix_market.inl」を変更して例外を取り除きました。行列の列をループしてから再度列をループすることでファイルに値を書き込む奇妙なネストされたループがありました(num_rowsは考慮されません)正方形ではなく、コードは存在しない場所にアクセスしようとしていました..変更されたコードは次のとおりです。
for(size_t j = 0; j < mtx.num_cols; j++)
{
// Modified below: mtx.num_cols --> mtx.num_rows
for(size_t i = 0; i < mtx.num_rows; i++)
{
write_value(output, mtx(i,j));
output << "\n";
}
}
ただし、この .mtx ファイルから読み取るときに、これがさまざまな形式コンストラクターにどのように影響するかはわかりません