在模拟中,我正在使用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');
矩阵data
看起来像
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
读取相同的文件,并且它从文件的开头返回所有数据(尽管用零而不是nans填充),所以我相信问题不在与文件。
为什么会这样?
一个最小的工作示例是没有省略号的第一个代码块。
作为参考,第一行具有12个csvs,并且每跳一步将其增加11
编辑:
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
答案 0 :(得分:2)
Matlab的readmatrix
试图变得聪明,并在要传递的CSV文件的数据模型中定位一个二维矩阵。看起来好像经过了前几行,这些行没有显式的尾随空白“单元格”。
您可以通过设置导入选项来控制它。在文件上运行opts = detectImportOptions(...);
,然后查看DataLines
属性。如果不是从1开始,请将其设置为[1 Inf]
,以强制readmatrix
读取所有行。然后调用readmatrix
,显式传递该选项结构。
要紧凑(可能更有效)地执行此操作,请像下面这样直接调用readmatrix
并使用显式选项:
readmatrix(path2mat,delimitedTextImportOptions('DataLines',[0,Inf]))