2

所以我有一个脚本,可以在不同的环境中为我解析一些数据,然后我将这些数据输出到文件中,稍后我想将其读入 MATLAB。但是,如果我将 10 个数据集写入同一个文件(理想情况),MATLAB 只会读取第一个数据集。理想情况下,我想读取包含结果的结构单元数组进口。我对如何输出文件有一些余地,但基本上它必须是简单的,我可以一次写一行。

不幸的是,仅将附加数据集作为列附加是非常困难的。以下是一些示例数据的示例:

DataSet1
x   y   z
3.82724 60.8234 13.0031
3.79987 60.909  -8.89291
3.75338 60.9124 19.5031
3.67715 61.0104 -24.5894
3.68124 61.0889 -20.8511
3.88438 61.1817 34.891
3.71405 61.2379 16.31
3.85504 61.245  -19.3778
4.09736 68.85   5.86954
3.39505 69.9457 64.8669
3.36033 69.9552 -58.8838
3.39427 70.9253 -26.0232
3.35769 70.9523 18.7863

DataSet2
x   y   z
3.73244 60.597  -21.6651
3.81217 60.712  -29.5505
3.74396 60.7554 -43.6225
3.70079 60.8271 -69.0996
3.87417 60.8662 -49.8068
3.74371 61.6553 34.915
3.815   61.7063 28.5842
3.88035 61.802  78.4314

理想情况下,我想保持这种结构。我看到的最佳替代方案是写入大量不同的文件(不理想),或者将其写入一个长数组,然后在其中包含一些标头信息,指示每个数据集的开始位置。再次,不是一个理想的情况。有什么方法可以使用类似于 importdata() 的东西吗?

4

3 回答 3

3

您可以使用文本扫描。它非常灵活,因此我相信您可以根据自己的情况进行调整。这是您的示例数据集的代码:

C = textscan(fd, '%f%f%f', 'TreatAsEmpty', {'x y z', 'Dataset1', 'Dataset2'});

C 是一个包含 3 个具有双值的列向量的单元格,每个 %f 一个。

>> C{1}

ans =

   NaN
   NaN
3.8272
3.7999
3.7534
....

如您所见,您将在有数据集分隔符的地方获得 NaN,因此您可以轻松拆分数据集。'string' 数据集分隔符必须明确指定为 TreatAsEmpty 参数(我在此处更改了 'xy z' 字符串以在字符之间包含一个空格)。

于 2012-09-20T08:16:09.673 回答
1

Matlab 附带的所有文本读取/导入例程都假设每个文件有 1 个数据集。可能带有一些标题行或一些随机缺失值或空白行,但这就是它们的灵活性。

如果要导入这些数据集,则必须编写自己的例程,该例程fgetl在循环中使用,解释和解析每一行并将其附加到(可能是新的)单元格数组中。

问题变成了:您花在编写该例程上的时间是否值得摆脱多个文件的“丑陋”,每个数据集 1 个?

于 2012-09-20T05:07:45.453 回答
0

如果可以的话,我会鼓励你摆脱基于文本的数据的束缚。

如果您使用 Matlab 生成数据,那么您有几个简单的选择。例如,您可以使用save带有-append标志的命令将变量添加到文件中。

save('someFileName.mat', 'Dataset1');  %Create a file with one variable
% ... do more work
save('someFileName.mat', 'Dataset1', '-append');  %Add another variable to the dataset

您还可以(截至 2012a)使用matfile该类来操作单个变量,例如

interfaceToFile = matfile('someFileName.mat','writable',true);
interfaceToFile.datasets = cell(100,1);
interfaceToFile.datasets(1,1) = {dataset1}; 
interfaceToFile.datasets(2,1) = {dataset2}; 

如果您使用其他方法来生成数据,我会研究 HDF5 格式。它被开发用于 C 和 Fortran 程序,并具有高效的 Matlab 接口,以及许多其他语言的实现。

如果您需要文本,那么其他答案之一可能就足够了。

于 2012-09-20T19:40:10.047 回答