有没有办法对此进行矢量化?

时间:2014-05-13 19:06:44

标签: matlab vectorization

有什么方法可以让我对此进行矢量化吗?

for i = 1:totSamples
    sec(i,1)    = str2double(data{4}{i,1}(end-1:end));
    min(i,1)    = str2double(data{4}{i,1}(end-4:end-3));
    hour(i,1)   = str2double(data{4}{i,1}(1:end-6));
end

我尝试使用此解决方案:https://stackoverflow.com/a/8370368/1583025但我收到此错误:

  

使用end时出错   涉及“结束”的不正确的单元格或结构引用。   最有可能的原因是对单元格或结构的多个元素的引用,后跟>附加的下标或结构引用。

     

文件错误(第64行)   sec(:,1)= reshape(sscanf(sprintf('%s#',data {4} {:,1}(end-1:end)),'%g#'),size(data {4}) );

2 个答案:

答案 0 :(得分:3)

我使用cellfun解决了这个问题:

secs = cellfun(@(x) x(end-1:end),data{4}(:),'UniformOutput',false);
mins = cellfun(@(x) x(end-4:end-3),data{4}(:),'UniformOutput',false);
hours = cellfun(@(x) x(1:end-6),data{4}(:),'UniformOutput',false);

sec(:,1)    = reshape(sscanf(sprintf('%s#', secs{:}), '%g#'), size(secs));
min(:,1)    = reshape(sscanf(sprintf('%s#', mins{:}), '%g#'), size(mins));
hour(:,1)   = reshape(sscanf(sprintf('%s#', hours{:}), '%g#'), size(hours));

修改

这是我发现的更快的方式。 cellfuns花了太长时间,所以我利用MATLAB的懒惰复制:

time    = reshape(sscanf(sprintf('%s#',data{4}{1:totSamples}),'%d:%d:%d#'), 3,[])';
sec     = time(:,3);
min     = time(:,2);
hour    = time(:,1);

clear time;

答案 1 :(得分:1)

您是否考虑过datevec? 它实际上可以在一行中完成:

我假设您的数据和单元格结构如下:

% example data
data{4}{1,1} = '05:20:42'
data{4}{2,1} = '06:22:42'
data{4}{3,1} = '07:24:42'

然后就这样做:

[~,~,~,hour,min,sec] = datevec(data{4},'HH:MM:SS')

返回:

hour =

     5
     6
     7


min =

    20
    22
    24


sec =

    42
    42
    42

可能需要稍作修改,但这就是方法。可能也更快。