3

.mat ファイルを .csv ファイルに変換するオクターブ プログラムを作成しようとしています。.mat ファイルには、行列 X と列ベクトル y があります。X には 0 と 1 が入力され、y には 1 から 10 までのラベルが入力されます。y を取得して X の前に配置し、.csv ファイルとして書き込みます。

これが私の最初のアプローチのコードスニペットです:

load(filename, "X", "y");
z = [y X];

basename = split{1};
csvname = strcat(basename, ".csv");

csvwrite(csvname, z);

結果のファイルには、8.560596795891285e-06、1.940359477121703e-06 など、非常に小さな 10 進数が多数含まれています

私の 2 番目のアプローチは、ループして手動で値を .csv ファイルに書き出すことでした。

load(filename, "X", "y");
z = [y X];

basename = split{1};
csvname = strcat(basename, ".csv");
csvfile = fopen(csvname, "w");

numrows = size(z, 1);
numcols = size(z, 2);

for i = 1:numrows
  for j = 1:numcols
    fprintf(csvfile, "%d", z(i, j));
    if j == numcols
      fprintf(csvfile, "\n");
    else
      fprintf(csvfile, ",");
    end
  end
end

fclose(csvfile);

正しい結果が得られましたが、非常に長い時間がかかりました。

正しい値を書き込む方法で csvwrite を使用する方法、または .csv ファイルをより効率的に手動で作成する方法を教えてください。

ありがとう!

4

2 に答える 2

4

問題は、yがタイプのchar場合、Xベクトルもcharに変換されることです。ラベルは数字に他ならないので、ラベルを数字に変換し、次を使用してデータを保存できますcsvwrite

csvwrite('data.txt', [str2num(y) X]);

編集また、ループでは整数変換を使用して数値を保存します%dcsvwrite、データがタイプの場合は書き込みが2倍になりますdouble。ゼロが正確にゼロでない場合は、csvwrite科学的記数法でそれらを書き込みますが、ループはそれらを丸めます。したがって、異なる動作。

于 2012-10-11T22:14:43.193 に答える
3

コードが Matab / octave 用に最適化されていないことに注意してください。for i と for j の行を入れ替えます。

オクターブは列の優先順位が高いため、キャッシュ効率が高くありません。おそらく許容できる時間に変更することで、ループ全体を高速化します

于 2012-10-11T22:54:47.293 に答える