为什么Matlab中的readmatrix跳过前n行?

为什么Matlab中的readmatrix跳过前n行?,matlab,csv,file,Matlab,Csv,File,在我的模拟中,我使用writematrix将数据写入文件,然后使用readmatrix将其读回。我在每个时间步追加到单个文件,每一行的长度与前一行相同或更长 由于某种原因,在输出文件上使用readmatrix时,前n行会被完全跳过,就像在“根本不读取”中一样。例如,我的文件如下所示: ... 11.8,1,2,3,4,5,6,7,8,9,10,2 11.9,1,2,3,4,5,6,7,8,9,10,2 ... 12.3,1,2,3,4,5,6,7,8,9,10,2 12.4,7,8,9,10,7

在我的模拟中,我使用
writematrix
将数据写入文件,然后使用
readmatrix
将其读回。我在每个时间步追加到单个文件,每一行的长度与前一行相同或更长

由于某种原因,在输出文件上使用
readmatrix
时,前n行会被完全跳过,就像在“根本不读取”中一样。例如,我的文件如下所示:

...
11.8,1,2,3,4,5,6,7,8,9,10,2
11.9,1,2,3,4,5,6,7,8,9,10,2
...
12.3,1,2,3,4,5,6,7,8,9,10,2
12.4,7,8,9,10,7,8,9,10,1,2,1,1,2,3,4,5,6,3,4,5,6,1
12.5,7,8,9,10,7,8,9,10,1,2,1,1,2,3,4,5,6,3,4,5,6,1
...
30.5,7,8,9,10,7,8,9,10,1,2,2,1,2,3,4,5,6,3,4,5,6,2
30.6,7,8,9,10,7,8,9,10,1,2,2,1,2,3,4,5,6,3,4,5,6,2
30.7,17,18,19,20,1,2,7,8,9,10,1,1,2,3,4,5,6,3,4,5,6,2,11,12,13,14,15,16,7,8,9,10,1
30.8,17,18,19,20,1,2,7,8,9,10,1,1,2,3,4,5,6,3,4,5,6,2,11,12,13,14,15,16,7,8,9,10,1
...
(第一列是一个时间戳,因此第一个省略号表示t=0到t=11.7。在t=30.7时,条目数量会有另一个跳跃),当我使用命令读取时

data = readmatrix('/path/to/file/data.csv');
矩阵
数据
如下所示

12.4 7 8 9 10 7 8 9 10 1 2 1 1 2 3 4 5 6 3 4 5 6 1
12.5 7 8 9 10 7 8 9 10 1 2 1 1 2 3 4 5 6 3 4 5 6 1
12.6 7 8 9 10 7 8 9 10 1 2 1 1 2 3 4 5 6 3 4 5 6 1
...
30.5 7 8 9 10 7 8 9 10 1 2 2 1 2 3 4 5 6 3 4 5 6 2
30.6 7 8 9 10 7 8 9 10 1 2 2 1 2 3 4 5 6 3 4 5 6 2
30.7 17 18 19 20 1 2 7 8 9 10 1 1 2 3 4 5 6 3 4 5 6 2 11 12 13 14 15 16 7 8 9 10 1
30.8 17 18 19 20 1 2 7 8 9 10 1 1 2 3 4 5 6 3 4 5 6 2 11 12 13 14 15 16 7 8 9 10 1
...
也就是说,跳过t=12.4之前的所有条目(即行长度的第一步跳转)。 在该文件中,如果我删除第一步跳转之前的所有内容(即t=12.4之前的所有内容),那么我将得到相同的矩阵
数据
,因此我们可以得出结论,后续的步骤跳转不会导致任何问题。如果我从第二步跳转中删除所有内容(即t=30.6之后的所有内容),那么它仍然会跳过t=12.4之前的所有条目。如果我没有跳步(即只有t=0到t=12.3),那么它会愉快地读到第一行

我曾尝试使用
csvread
读取同一个文件,它返回文件开头的所有数据(虽然用零而不是nans填充),因此我相信问题不在文件上

为什么会这样

最简单的工作示例是第一个没有省略号的代码块

作为参考,第一行有12个CSV,每一步跳跃增加11个CSV

编辑:

detectImportOptions的输出

ans = 

  DelimitedTextImportOptions with properties:

   Format Properties:
                    Delimiter: {','}
                   Whitespace: '\b\t '
                   LineEnding: {'\n'  '\r'  '\r\n'}
                 CommentStyle: {}
    ConsecutiveDelimitersRule: 'split'
        LeadingDelimitersRule: 'keep'
                EmptyLineRule: 'skip'
                     Encoding: 'UTF-8'

   Replacement Properties:
                  MissingRule: 'fill'
              ImportErrorRule: 'fill'
             ExtraColumnsRule: 'addvars'

   Variable Import Properties: Set types by name using setvartype
                VariableNames: {'Var1', 'Var2', 'Var3' ... and 20 more}
                VariableTypes: {'double', 'double', 'double' ... and 20 more}
        SelectedVariableNames: {'Var1', 'Var2', 'Var3' ... and 20 more}
              VariableOptions: Show all 23 VariableOptions 
    Access VariableOptions sub-properties using setvaropts/getvaropts
        PreserveVariableNames: false

   Location Properties:
                    DataLines: [4 Inf]
            VariableNamesLine: 0
               RowNamesColumn: 0
            VariableUnitsLine: 0
     VariableDescriptionsLine: 0 
    To display a preview of the table, use preview

Matlab的readmatrix
试图变得聪明,在您传递的CSV文件的数据模型中定位一个二维矩阵。它看起来像是通过了前几行,这些行没有明确的尾随空“单元格”

您可以通过设置导入选项来控制这一点。运行
opts=detectImportOptions(…)并查看
数据线
属性。如果不是从1开始,则将其设置为
[1 Inf]
以强制
readmatrix
读取所有行。然后调用
readmatrix
,显式传递该选项结构

要简洁(可能更有效)地执行此操作,请立即使用显式选项调用
readmatrix
,如下所示:

...
11.8,1,2,3,4,5,6,7,8,9,10,2
11.9,1,2,3,4,5,6,7,8,9,10,2
...
12.3,1,2,3,4,5,6,7,8,9,10,2
12.4,7,8,9,10,7,8,9,10,1,2,1,1,2,3,4,5,6,3,4,5,6,1
12.5,7,8,9,10,7,8,9,10,1,2,1,1,2,3,4,5,6,3,4,5,6,1
...
30.5,7,8,9,10,7,8,9,10,1,2,2,1,2,3,4,5,6,3,4,5,6,2
30.6,7,8,9,10,7,8,9,10,1,2,2,1,2,3,4,5,6,3,4,5,6,2
30.7,17,18,19,20,1,2,7,8,9,10,1,1,2,3,4,5,6,3,4,5,6,2,11,12,13,14,15,16,7,8,9,10,1
30.8,17,18,19,20,1,2,7,8,9,10,1,1,2,3,4,5,6,3,4,5,6,2,11,12,13,14,15,16,7,8,9,10,1
...
readmatrix(路径2Mat,分隔的DTextImportOptions('DataLines',[0,Inf]))

试着在你的文件上运行
detectImportOptions()
,看看它能告诉你什么。我敢打赌,
readmatrix
正试图变得“聪明”,找到实际上是二维矩阵的区域。@AndrewJanke,谢谢你的提示。我已经看过了,但我不确定我在找什么。有一行写着
EmptyLineRule:“skip”
所以它可能把它当作一个空行?从文档
detectImportOptions
看,它似乎是针对表格的-我不知道如何将这些信息转换到
readmatrix
的上下文中,您能否将
detectImportOptions
结果的完整显示作为您问题的一部分发布,以便我们可以看到它?还有一个链接可以下载你的CSV文件,这样我们就可以很容易地复制了?那
数据线:[4 Inf]
看起来可疑。如果强制将其设置为
[1 Inf]
,然后调用
readmatrix
,显式传递您拥有的修改后的
DelimitedTextImportOptions
对象,会发生什么情况?如果您想从一开始就正确执行,请调用
readmatrix(路径2mat,DelimitedTextImportOptions('DataLines',[0,Inf]))
并立即指定选项。这个没有默认设置,所以在文件的第4行中可能有一些东西,MATLAB认为这是一个头。。。