【问题标题】:Convert .mat to .csv octave/matlab将 .mat 转换为 .csv 八度/matlab
【发布时间】:2012-10-02 16:32:22
【问题描述】:

我正在尝试编写一个将 .mat 文件转换为 .csv 文件的 octave 程序。 .mat 文件有一个矩阵 X 和一个列向量 y。 X 填充了 0 和 1,y 填充了从 1 到 10 的标签。我想把 y 放在 X 前面,然后将其写为 .csv 文件。

这是我第一种方法的代码sn-p:

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 文件。

谢谢!

【问题讨论】:

    标签: matlab csv octave


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您告诉我!
    【解决方案2】:

    问题在于,如果y 的类型为char,您的X 向量也会被转换为字符。由于您的标签只是数字,您可以简单地将它们转换为数字并使用csvwrite保存数据:

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

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

    【讨论】:

    • 我尝试在向量 y 上使用 str2num,但出现错误:对 str2num 的调用无效... 然后我使用 isumeric 检查 X 和 y 以验证这两个都只包含数字。两者都返回 1。
    • @gpian 好吧,那么您保存的是您的数据。在命令窗口中输入X 并查看结果。并输入whos 以查看yX 的类型。
    • X 和 y 都有 double 类型,这是我没想到的,但应该没问题。那么也许有一些浮点舍入错误?
    • @gpian 您的零很可能不是零。在屏幕上打印一个这样的条目,例如 X(1,2)。一个应该是 0。或者输入num2str(X,’%.10f’)
    • @gpian 你在循环中通过将双精度数转换为整数来舍入它们。 csvwrite 不这样做。这就是为什么你会得到不同的结果。
    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多