将.mat转换为.csv octave / matlab

时间:2012-10-11 22:02:18

标签: matlab csv octave

我正在尝试编写一个将.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等......

我的第二种方法是循环并手动将值写入.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文件。

谢谢!

2 个答案:

答案 0 :(得分:4)

问题是,如果y的类型为char,则您的X向量也会转换为char。由于您的标签只是数字,因此您只需将它们转换为数字并使用csvwrite保存数据:

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

修改此外,在循环中,您使用整数转换%d保存数字,而csvwrite如果您的数据类型为double则会写入双精度数。如果零不完全为零,csvwrite将用科学记数法写出它们,而你的循环将围绕它们。因此,不同的行为。

答案 1 :(得分:3)

您的代码没有针对Matab / octave进行优化。切换for i和j行。

Octave是列的主要顺序,所以它不会缓存有效地执行您的操作。通过将更改改为可接受的时间来加速整个循环