繁体   English   中英

将.mat转换为.csv octave / matlab

[英]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文件。

谢谢!

问题是如果ychar类型,你的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM