1

私がやりたいことはとても簡単です。これは機能します:

save weights.txt weights

しかし、これはしません:

filename = "weights.txt"
save filename weights

まあ、それは行列を保存しますが、 ...ではなく...weightsという名前のファイルに保存します。filenameweights.txt

私はもう試した

save("-ascii", filename, "weights");

しかし、マトリックスの名前は文字列でなければならないので、それはひどいです。さらに、これは機能しません。Octaveは、NDArray(?)をMatrixに変換できないと言っています。

なんで?それを機能させる方法は?

4

2 に答える 2

0

そこには2つの問題があります:

  1. コマンドとして使用saveして変数を渡すか、関数として渡しますが、変数名を文字列として渡さないでください。これを回避する方法はありません。コマンド形式が機能する方法は、すべての引数を文字列に変換することです。これを行うとsave weights.txt weights、と解釈されsave ("weights.txt", "weights")、行うsave filename weightsと同じでsave ("filename", "weights")あるため、 filename という名前のファイルに保存されます。また、変数自体ではなく、変数名を文字列で渡す必要があるのはなぜですか? 保存しようとしている変数が文字列であると想像してください。save文字列または文字列として名前が付けられた変数を保存する必要があるかどうかはどうすればわかりますか?

  2. -asciiオプションで NDArray を保存します。これはできません。別の形式を使用する必要があります。テキスト ファイルに保存する場合は、-text代わりにascii. text は、行列の次元に関する情報も保存する形式であるため、任意のサイズの行列を正しく保存およびロードできます。ascii 形式では、すべての情報が失われるため、2 次元を超える行列は失敗します。x = rand (3); save -ascii x_ascii.txt x; save -text x_text.txt xファイル内を調べて違いを確認してください。x3D マトリックスの場合、ascii として保存する方法を考えてもらえますか?

于 2012-11-12T12:20:26.167 に答える
0

dlmwrite区切られた ASCII データの書き込みに使用できます。

>> filename = "weights.txt";
>> weights = rand(3,3);
>> dlmwrite(filename, weights)
>> type weights.txt

0.16218,0.52853,0.26297
0.79428,0.16565,0.65408
0.31122,0.60198,0.68921

デフォルトではカンマ区切りですが、3 番目の引数として独自の区切り文字を渡すことができます。

編集:

MATLAB では、任意の次元の配列を で保存dlmwriteでき、データを で読み戻すことができますdlmread。しかし、carandraug が指摘しているように、ASCII 表現はせいぜい 2D になります (MATLAB は余分な次元を平坦化します)。エクスポートされた行列の形状をどこかに保存する場合でも、この情報を復元できます。

>> shape = "shape.txt";
>> weights = rand(3,3,3);
>> dlmwrite(filename, weights, 'precision', 17)
>> dlmwrite(shape, size(weights))
>> M = reshape(dlmread(filename), dlmread(shape));
>> all(M(:) == weights(:))
ans =
     1

もちろん、これは MATLAB のネイティブsave weights; load weights.

于 2012-11-11T22:01:45.377 に答える