在MATLAB中有效地使用sscanf

时间:2013-11-26 08:15:29

标签: string matlab scanf

我有一个数千个字符的字符串,这意味着它中有大约300列用空格分隔。有些列是字符串,大多数是整数/浮点数。问题是我只需要读取一些列,例如第一列,第5列,第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列中阅读,我至少需要%f%*f 152次。所以我的问题是在MATLAB中使用sscanf最有效的方法是什么?如果我能找到一些强大且易于改变的东西,那就太棒了。例如,如果明天我决定我只需要第一列,第五列和第100列,其中我需要的列总数和列本身已经更改,那么应该很容易指定。如果工作太多,不用担心。任何技巧?

整个字符串有浮点数和字符串混合但我需要的列总是只有浮点数/整数,MATLAB返回params时加倍。提前谢谢!

2 个答案:

答案 0 :(得分: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 reference
str2num reference
str2double reference

答案 1 :(得分:2)

这是一段使用%*f(带有单元格)复制repmat的代码。然后,它会在提供的索引处将%*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{:}]