首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Matlab中的readmatrix会跳过前n行?

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

Stack Overflow用户
提问于 2020-06-16 09:41:55
回答 1查看 700关注 0票数 1

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

由于某些原因,在输出文件上使用readmatrix时,会完全跳过前n行,因为根本不读取。例如,我的文件如下所示:

代码语言:javascript
运行
复制
...
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中,条目数量有另一个跳跃),并且当我使用以下命令读取时

代码语言:javascript
运行
复制
data = readmatrix('/path/to/file/data.csv');

矩阵data看起来像这样

代码语言:javascript
运行
复制
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之前的所有内容),那么我会得到相同的矩阵data,所以我们可以得出结论,后续的跳转不会导致任何问题。如果我删除了第二步跳转中的所有内容(即t=30.6之后的所有内容),那么它仍然会跳过t=12.4之前的所有条目。如果我没有跳步(即只有t=0到t=12.3),那么它会愉快地读入第一行。

我尝试过使用csvread读取相同的文件,它返回从文件开头开始的所有数据(尽管用零而不是nan填充),所以我确信问题不是文件的问题。

为什么会发生这种情况?

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

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

编辑:

来自detectImportOptions的输出

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-16 15:46:19

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

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

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

代码语言:javascript
运行
复制
readmatrix(path2mat,delimitedTextImportOptions('DataLines',[0,Inf]))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62399666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档