String 使用多个字符串调用sscanf
我想将日期字符串转换为数字矩阵,我需要以非常高的速度进行转换。我的意见:String 使用多个字符串调用sscanf,string,matlab,date,matrix,scanf,String,Matlab,Date,Matrix,Scanf,我想将日期字符串转换为数字矩阵,我需要以非常高的速度进行转换。我的意见: dateStrings = [ '2015 07 09 12 28 18.17641'; '2015 07 09 12 28 19.17641'; '2015 07 09 12 28 20.17641'] 现在我想使用sscanf将它们转换为数字。(原因是速度非常快)。如果dateStrings只包含1个字符串,那么这很好,但在本例中,我有3个字符串。(实际上是5万人以上) 所需的输出是一
dateStrings = [
'2015 07 09 12 28 18.17641';
'2015 07 09 12 28 19.17641';
'2015 07 09 12 28 20.17641']
现在我想使用sscanf
将它们转换为数字。(原因是速度非常快)。如果dateStrings只包含1个字符串,那么这很好,但在本例中,我有3个字符串。(实际上是5万人以上)
所需的输出是一个如下所示的矩阵:
2015 7 9 12 28 18.176
2015 7 9 12 28 19.176
2015 7 9 12 28 20.176
有没有办法使用多个字符串随时调用sscanf,或者我必须进行循环
任何关于如何解决问题的建议都是受欢迎的,只要速度快
编辑:Suever的解决方案给了我很多速度!然而,上述输入并不真实。实际输入如下所示。既然您提到使用单元格实际上更快,您将如何使用此输入?此时,我使用
cell2mat
转换输入,然后用空格替换某些索引,以字符串结尾,如:'2015 07 09 12 28 18.17641'
Input is 4x1 cell:
'2015-11-18T23:31:49.37486 +01:00'
'2015-11-18T23:31:49.37583 +01:00'
'2015-11-18T23:31:49.37658 +01:00'
'2015-11-18T23:31:49.37735 +01:00'
二维字符数组尤其难以操作。如果您首先使用
cellstr
将其转换为单元格,使用起来会容易得多
C = cellstr(dateStrings);
output = sscanf(sprintf('%s ', C{:}), '%f');
output = reshape(output, [], numel(C)).'; %'
%// 2015 7 9 12 28 18.176
%// 2015 7 9 12 28 19.176
%// 2015 7 9 12 28 20.176
或者您可以使用cellfun
output = cellfun(@(x)sscanf(x, '%f'), C, 'uni', 0);
output = cat(2, output{:}).';
您还可以结合使用str2num
和strjoin
output = reshape(str2num(strjoin(C)), [], numel(C)).';
老实说,循环使用初始数据可能是最快的选择
output = NaN(size(dateStrings,1), 6);
for k = 1:size(dateStrings, 1);
output(k,:) = sscanf(dateStrings(k,:), '%f');
end
我使用不同行数的输入对这些方法进行了基准测试,得到了以下结果。第一个和第三个看起来是最有表现力的
更新
由于您最初的问题根本不是数据的准确表示,您现在需要将格式说明符更改为sscanf
。您也可以直接传递输入单元格数组(C
),而不必使用cellstr
sscanf(x, '%d-%d-%dT%d:%d:%f +%*d:%*d')
因此,我们可以将其应用于上面的一些答案:
%// Option #1
fmt = '%d-%d-%dT%d:%d:%f +%*d:%*d';
output = reshape(sscanf(sprintf('%s ', C{:}), fmt), [], numel(C)).'; %'
%// Option #2
output = cellfun(@(x)sscanf(x, fmt), C, 'uni', 0);
output = cat(2, output{:}).'; %'
%// Option #4
output = NaN(numel(C), 6);
for k = 1:numel(C)
output(k,:) = sscanf(C{k}, fmt);
end
二维字符数组尤其难以操作。如果您首先使用
cellstr
将其转换为单元格,使用起来会容易得多
C = cellstr(dateStrings);
output = sscanf(sprintf('%s ', C{:}), '%f');
output = reshape(output, [], numel(C)).'; %'
%// 2015 7 9 12 28 18.176
%// 2015 7 9 12 28 19.176
%// 2015 7 9 12 28 20.176
或者您可以使用cellfun
output = cellfun(@(x)sscanf(x, '%f'), C, 'uni', 0);
output = cat(2, output{:}).';
您还可以结合使用str2num
和strjoin
output = reshape(str2num(strjoin(C)), [], numel(C)).';
老实说,循环使用初始数据可能是最快的选择
output = NaN(size(dateStrings,1), 6);
for k = 1:size(dateStrings, 1);
output(k,:) = sscanf(dateStrings(k,:), '%f');
end
我使用不同行数的输入对这些方法进行了基准测试,得到了以下结果。第一个和第三个看起来是最有表现力的
更新
由于您最初的问题根本不是数据的准确表示,您现在需要将格式说明符更改为sscanf
。您也可以直接传递输入单元格数组(C
),而不必使用cellstr
sscanf(x, '%d-%d-%dT%d:%d:%f +%*d:%*d')
因此,我们可以将其应用于上面的一些答案:
%// Option #1
fmt = '%d-%d-%dT%d:%d:%f +%*d:%*d';
output = reshape(sscanf(sprintf('%s ', C{:}), fmt), [], numel(C)).'; %'
%// Option #2
output = cellfun(@(x)sscanf(x, fmt), C, 'uni', 0);
output = cat(2, output{:}).'; %'
%// Option #4
output = NaN(numel(C), 6);
for k = 1:numel(C)
output(k,:) = sscanf(C{k}, fmt);
end
很不错的!使用第一种解决方案使我加快了很多。我编辑了我的问题,你对后面的部分有什么意见吗?@Goatcat我已经更新了答案。下次发布实际数据是有益的。尤其是当它需要被解析的时候。哇!谢谢,伟大的作品!在第一次测试中,您的解决方案的速度大约快10倍(使用选项1)。我永远感激你@目标如果一个答案解决了你的问题,不要在评论中再问另一个问题,也不要用新的要求更新问题。相反,将答案标记为已接受,并在单独的帖子中提出另一个问题。非常好!使用第一种解决方案使我加快了很多。我编辑了我的问题,你对后面的部分有什么意见吗?@Goatcat我已经更新了答案。下次发布实际数据是有益的。尤其是当它需要被解析的时候。哇!谢谢,伟大的作品!在第一次测试中,您的解决方案的速度大约快10倍(使用选项1)。我永远感激你@目标如果一个答案解决了你的问题,不要在评论中再问另一个问题,也不要用新的要求更新问题。相反,将答案标记为已接受,并在单独的帖子中提出另一个问题。