所以我有一个脚本可以在不同的环境中为我解析一些数据,并且我将这些数据输出到文件中,我稍后会读到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()的东西?
答案 0 :(得分: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,因此您可以轻松地拆分数据集。必须将'字符串'数据集分隔符显式指定为TreatAsEmpty参数(我在此处更改了'x y z'字符串以在字符之间包含一个空格)。
答案 1 :(得分:1)
Matlab附带的所有文本读取/导入例程假设每个文件有1个数据集。可能有一些标题行或一些随机缺失值或空行,但这是因为它们的灵活性。
如果要导入这些数据集,则必须编写自己的例程,在循环中使用fgetl
,解释并解析每个单独的行并将其附加到(可能是新的)单元格数组中。
问题变成了:你花在编写那个例程的时间是否值得摆脱多个文件的“丑陋”,每个数据集1个?
答案 2 :(得分: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接口,以及许多其他语言的实现。
如果您需要文字,那么其他答案之一就足够了。