0

C++ でのベクトル プログラミングは初めてです。サイズ不明の2D行列を初期化したいのでベクトル側に来ました。1) .h と 2).cpp の 2 つのファイルがあります。.h ファイルで、このようにベクトルを初期化しました

vector<vector<double> > vector_stor;

次に、別のソースから各次元のサイズを取得した後、.cpp で、このようにベクトルのサイズを変更しました

size_X=5; //assumption
size_Y=5; //assumption    
vector_stor.resize(size_X);
for(int i=0;i<size_X;i++)
vector_stor[i].resize(size_Y);

今、このような Mat_VarRead 関数を使用して、最初に matIO ライブラリによって読み取られた .mat ファイルからデータを保存したい

Mat_VarReadData(vector_stor); //there are other arguments also but for demo just assume it

Mat_VarReadData は void* データで引数を取り、私は 2D ベクトルを持っています。私がこのようにやっていると、エラーが発生します

エラー 1 エラー C2664: 'Mat_VarReadData' : パラメーターを 'std::vector<_Ty>' から 'void *' に変換できません

どうすればこれを行うことができるか教えてもらえますか?とても参考になります。

編集部分:

  matvar = Mat_VarReadInfo(mat,"data_struct");
    field=Mat_VarGetStructFieldByName(matvar,"vect_stor",0);
    int    start[2]={0,0};
    int    stride[2]={1,1};
    int    edge[2];
           edge[0]=field->dims[0];
           edge[1]=field->dims[1];
    Mat_VarReadData(mat,field,vector_stor,start,stride,edge);

vector_stor は、私が助けを求めている変数です。

ありがとう

4

2 に答える 2

1

への入力の順序を確認してくださいMat_VarReadData。関数は次のようなものである必要があります

Mat_VarReadData( ..., vector<vector<double> > mat, ... )

そして、その入力と一致するように入力を整列する必要がありますvector_stor

私が機能を持っている場合:

foo(int a, double b);

それから私が呼び出すとき、最初の引数は anであり、2番目の引数は a でfooある必要があります。ここでも同じですが、入力タイプを実際に渡そうとしているものと一致させる必要があります。intdouble

またチェックアウト: http://libmatio.sourcearchive.com/documentation/1.3.3/group__MAT_g1845000f4fc6252ec5ff11c4b9f0759f.html

関数は、ベクトルのベクトルではなく、1 次元配列にデータをダンプしようとしているようです。これを試して:

std::vector<double> mat;
mat.resize(size_X*size_Y);
// call Mat_VarReadData with &mat[0] as your void*
// now you can index with 
mat[i*size_Y + j];

これは、行列が、MATLAB がメモリから使用する列優先形式であることを前提としています。行メジャーを使用する場合は、インデックスを作成する必要があります

mat[i + j*size_X];

編集:なぜ&mat[0]またはmat.data()(2番目はC++ 11が必要です、それを指摘してくれてありがとう)動作するかについて興味がある場合std::vectorは、が連続していることが保証されている ためです。

于 2013-09-06T03:18:05.737 に答える
0

他の人がすでに指摘しているように、どちらvector <vector<double> >も渡すことも、vector<double>直接にMat_VarReadDataの形式で渡すこともできませんvoid*。それを行う安全な方法はありません。あなたができる最善の方法は、最初にデータを生の配列に取得してから、それを好きなコンテナーに適宜変換することです。

私は MatIO に詳しくありませんが、正しい方向に向けるように努めます。のドキュメントを見てみましたMat_VarReadData。あまり役に立たないことは認めざるを得ませんが、とにかく、対応する変数に関する情報を取得した後にのみデータを読み取ることができると述べています。これは、関数を使用して実行できますMat_VarReadInfomatvar_tこの関数は、本質的に変数の記述子である を返します。データを動的matvar_tに割り当てるために必要なすべての情報が含まれているように思えます。つまり、 new[]を使用します。より正確には、特定の変数のデータを格納するために必要なバイト数を正確に保持する必要があります。それは多かれ少なかれあなたがする必要があることだと思います:matvar_t::data_size

警告、テストされていません

matvar_t* varInfo = Mat_VarReadInfo(matFileDescriptor, varName)
char* data = new char[varInfo->data_size];
Mat_VarReadData(matFileDescriptor, varInfo, (void*)(data), start, stride, edge);

startstride、およびedgeが実際に何を表しているかを理解するのはあなたに任せます。

データを配列に読み取った後data、おそらく適切な算術型に変換する必要がありますが、double確信が持てません。そうして初めて、それらを に合わせることができますvector<double>。この部分については、MatIO に深く入り込みすぎているため、残念ながら私はあなたを助けることができません。

基本的な c/c++ と MatIO に苦労していることを理解しています。これは、c/c++ でコーディングを始めたばかりの人が使用する単純なライブラリではないため、プロジェクトを進める前に、まず MatIO で入手できるドキュメントを注意深く読むことを強くお勧めします。基本的な c/c++ に関する読み物も非常に役立ちます。

于 2013-09-06T04:03:12.553 に答える