3

C++ プログラムの出力としてテキスト ファイルがあります。実際には 3x100x200 の要素行列です。200 のタイムスタンプを超える 3x100 の 2d 行列。これをMatlabワークスペースにロードして3Dプロットで視覚化できるように保存したいと思います。テキストファイルの構造がわかりません。「[..]」と「;」をどこに置くべきかのように と " " または "," です。

その方法でC++コードからファイルに出力できるように、誰かが例を挙げてください。

4

5 に答える 5

4

テキストファイルを忘れてください。代わりに、Matio ライブラリ.matを使用してファイルを書き込みます。このようにして、必要に応じてデータ フィールドをすばやく追加できます。

本当にテキスト ファイルを使用したい場合は、最初に行列の次元を書き、次にすべての要素を書き、最後にここで提案されているようにいくつかの再形成を行うことができます。

于 2012-10-26T09:27:55.400 に答える
3

余分なライブラリを使用せずにハックを見つけました。すべての2DマトリックスをoutMat(:、:、matIndex)として出力し、ループ内でmatIndexをインクリメントします。次に、matlabで.mをスクリプトとして実行しました。

void printArrs(){
    int i;
//  B(:,:,1) = [1 2 3; 4 5 6];
//  B(:,:,2) = [7 8 9; 0 0 0];
    ofstream outFile;
    outFile.open ("forPlot.m", ios::out | ios::app);
    matIndex++;
    outFile << "outMat(:,:," << matIndex << ") = [";
    for(i=0;i<fftLen;i++){
        outFile << Mag[0][i] << " ";
        outFile << Mag[1][i] << " ";
        outFile << Mag[2][i] << ";" << endl;
    }
    outFile << "];" << endl;
    outFile.close();
}

皆様のご回答ありがとうございます。いくつかの答えについては、私が推測するほど明確ではありませんでした。なぜなら、彼らは私が「Matlab」から「Matlab」に書きたいと思っていたからです。

于 2012-10-26T11:07:49.767 に答える
1

本当にテキスト ファイルを使用したい場合は、前述の Matio ライブラリを使用することをお勧めしますが、3D 配列を 2D に再形成して書き込み、読み取り後に 3D に再形成することで保存できます。この単純な MATLAB コードを見てください。3D マトリックスを csv ファイルに書き込みます。書き込み後、csv ファイルには、2 番目と 3 番目の次元がベクトルとしてストリーミングされた 2D マトリックスが含まれます。

A = rand(3,10,10);
csvwrite('data.txt', A);

B = csvread('data.txt');
% B is now 3 x 100 matrix, so you need to reshape
B = reshape(B, 3, 10, 10);
于 2012-10-26T10:38:59.903 に答える
1

「.csv」をグーグルで検索して、カンマ区切りの変数ファイルが何であるかを調べてください。それは助けになるはずです。私が正しく思い出せば、それらをMatlabにインポートできます。

于 2012-10-26T09:22:22.903 に答える
0

.mat ファイルに保存することをお勧めします。このようにファイル構造を気にする必要はありません。save関数
のドキュメントを参照してください。編集:私は質問を読み違え、マトリックスをC++で保存しようとしていることに気づきませんでした。Pukku のアドバイスに従い、Matio ライブラリを使用することをお勧めします。

Matlab で .mat ファイルを読み込むには、次を使用します。

load('myfile.mat')

これにより、マトリックスがワークスペースに配置されます。

于 2012-10-26T09:23:02.737 に答える