将.mat文件转换为.csv文件 Octave/Matlab

3
我正在尝试编写一个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个回答

4
问题是,如果ychar类型,那么你的X向量也会被转换为char。由于标签只是数字,因此您可以将其转换为数字并使用csvwrite保存数据:
csvwrite('data.txt', [str2num(y) X]);

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


我尝试对向量y使用str2num,但是出现了错误:调用str2num无效...然后我使用isnumeric检查了X和y,以验证它们都只包含数字。两者都返回1。 - gpian
@gpian 好的,那么你保存的是你的数据。在命令窗口中键入 X 并查看结果。然后输入 whos 以查看 yX 的类型。 - angainor
X和y都是double类型,这不是我预期的,但应该没问题。所以可能存在一些浮点舍入误差? - gpian
@gpian 很可能你的零不是真正的零。在屏幕上打印出一个这样的条目,比如X(1,2)。一个应该是0的条目。或者输入 num2str(X,’%.10f’) - angainor
@gpian 在循环中将双精度数强制转换为整数进行四舍五入。但是 csvwrite 不会这样做,这就是你得到不同结果的原因。 - angainor
我明白了,所以当我执行fprintf(csvfile, "%d", z(i,j))时,它会四舍五入。 - gpian

3

提醒一下,您的代码并不适用于Matab / Octave。请将for i和for j行交换位置。

Octave是按列主序排列的,因此您所做的操作并不高效。通过进行更改,可能会加快整个循环的速度,使其达到可接受的时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接