我的数据格式为:
Value1 junk:Value2 junk:Value3 ....
....
我只想获得价值观。请注意,垃圾实际上是索引(偏移量为1),范围从1到256,每行中的第一个元素没有垃圾值。
示例:
6 1:-1.000000 2:-1.000000 3:-1.000000 4:-1.000000 5:-1.000000 6:-1.000000 7:-1.000000 8:-0.631000 9:0.862000 10:-0.167000
1 1:-1.000000 2:-1.000000 3:-1.000000 4:-1.000000 5:-1.000000 6:-1.000000 7:-1.000000 8:0.510000 9:-0.213000 10:-1.000000
我想从上面得到以下矩阵:
6 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -0.631000 0.862000 -0.167000
1 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 0.510000 -0.213000 -1.000000
使用load(myFile)
时我只得到垃圾(除了每行中的第一个元素)。
我应该如何在MATLAB中解析它?
答案 0 :(得分:2)
您可以使用textscan
并使用星号(*
)来忽略某些字段。例如:
fid = fopen('input.txt', 'r'); %// Open the input file
A = textscan(fid, ['%f', repmat('%*[^:]:%f', 1, 10)]); %// Parse lines
fclose(fid); %// Close the input file
A = [A{:}]; %// Convert into a matrix
这里%*[^:]
匹配“垃圾”字段(直到第一个冒号的任何字符序列)。星号告诉textscan
忽略它。然后匹配一个冒号,然后是一个浮点数。这种模式重复10次。
另一种可能性是将冒号视为空格:
A = textscan(fid, ['%f', repmat('%*s %f', 1, 10)], 'Whitespace', ' :\b\t');
因此,对于给定的例子,实现了相同的效果。这看起来不太优雅,恕我直言。