3

我正在尝试编写一个将 .mat 文件转换为 .csv 文件的 octave 程序。.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 等...

我的第二种方法是循环并手动将值写入 .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是 type char,你的X向量也会被转换为 char 。由于您的标签只是数字,您可以简单地将它们转换为数字并使用以下方法保存数据csvwrite

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

编辑此外,在循环中,您使用整数转换保存数字,如果您的数据类型为%d,则写入双精度数。如果零不完全为零,将用科学记数法编写它们,而您的循环将对它们进行四舍五入。因此不同的行为。csvwritedoublecsvwrite

于 2012-10-11T22:14:43.193 回答
3

请注意,您的代码未针对 Matab / octave 进行优化。切换 for i 和 for j 行。

Octave 是列主要顺序,因此它的缓存效率不高。通过将更改更改为可能可接受的时间,它将加速整个循环

于 2012-10-11T22:54:47.293 回答