在MATLAB中高效使用sscanf

3

我有一个字符串,其中包含数千个字符,意味着其中大约有300个由空格分隔的列。其中一些列是字符字符串,大多数是整数/浮点数。问题在于,我只需要读取其中几列,例如第一列、第五列、第37列、第117列和第152列,并忽略其余的字符串。我唯一能想到的方法是在MATLAB中使用sscanf来执行以下操作:

mystring = '245    0.00000000 2456171.50000000  1030492816.000    5.14501001           1     IG      5     -1.188022   ....   5.032154 90';
params = sscanf(mystring, '%f %*f %*f %f %*f %f %*s %f %*f ... %f %*[^\n]')'];

对我来说,这似乎完全荒谬,因为如果我要读取第152列,则至少需要使用152次%f%*f。 因此,我的问题是,在MATLAB中使用sscanf最有效的方法是什么? 如果我能找到一些强大且易于更改的东西那就太棒了。 例如,如果明天我决定只需要第一列,第五列和第100列,其中我需要的总列数和列本身都已更改,则应该很容易指定。 如果太费力了,没关系。 整个字符串包含浮点数和字符串,但我需要的列始终只有浮点数/整数,MATLAB将其作为双精度返回到params中。 预先感谢您!

3
由于我需要使用%f或%*f 152次,您可以使用repmat来解决这个问题:['%f %*f ...' repmat('%*f') '...'] - Robert Seifert
2个回答

6
你可以使用strsplit函数来分割字符串,然后访问你感兴趣的数组元素。
mystring = '245    0.00000000 2456171.50000000  1030492816.000    5.14501001           1     IG      5     -1.188022   ....   5.032154 90';
split = strsplit(mystring);

如果您的MATLAB版本太旧,不包含strsplit函数,则可以从MATLAB Central下载。之后,您可以使用str2numstr2double将每个感兴趣的字符串转换为数字。
col5 = str2double(split(5));
% or
mycols = str2double(split([5 37 117]));

strsplit 参考
str2num 参考
str2double 参考

以上链接分别是strsplit函数、str2num函数和str2double函数的参考页面。

@FixedPoint 没问题,很高兴能帮忙。 - Tom Fenech

2

这里有一段代码,使用repmat(带有单元格)复制了%*f。然后在提供的索引处将%*f更改为%f,最后将单元格转换为char向量。

f_star_nb = 20;
f_ind = [2 6 9];

f = repmat({'%*f'}, f_star_nb, 1)
f(f_ind) = {'%f'};
f = [f{:}]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接