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)。我永远感激你@目标如果一个答案解决了你的问题,不要在评论中再问另一个问题,也不要用新的要求更新问题。相反,将答案标记为已接受,并在单独的帖子中提出另一个问题。