[英]Convert .mat to .csv octave/matlab
我正在尝试编写一个将.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文件。
谢谢!
问题是如果y
是char
类型,你的X
向量也会被转换为char。 由于您的标签只是数字,您只需将它们转换为数字并使用csvwrite
保存数据:
csvwrite('data.txt', [str2num(y) X]);
编辑此外,在循环中使用整数转换%d
保存数字,而如果数据类型为double
,则csvwrite
写入双精度数。 如果零不完全为零,则csvwrite
将使用科学记数法编写它们,而您的循环将围绕它们。 因此,不同的行为。
只是抬起你的代码并没有针对Matab / octave进行优化。 切换for i和j行。
Octave是列的主要顺序,因此它不会缓存有效地执行您的操作。 通过将更改改为可接受的时间,它将加速整个循环
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.