我正在尝试编写一个将.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文件。
谢谢!
答案 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是列的主要顺序,所以它不会缓存有效地执行您的操作。通过将更改改为可接受的时间来加速整个循环