【问题标题】:Is there any way to vectorize this?有什么办法可以矢量化吗?
【发布时间】:2014-07-01 14:48:43
【问题描述】:

我有什么办法可以矢量化它吗?

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 但我收到此错误:

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

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

【问题讨论】:

  • 你试过cellfun吗?
  • 你的循环代码一开始就工作了吗?除非sec 是一个单元类,否则如何存储str2double(data{4}{i,1}(end-1:end)) 会生成2x1 数据?
  • @Divakar 是的,循环代码有效。它只是非常缓慢。为什么 str2double 会生成 2x1 数据?
  • @alfonzo1955 因为(end-1:end)?
  • @Divakar 获取字符串的最后两个元素

标签: matlab vectorization


【解决方案1】:

我使用 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;

【讨论】:

    【解决方案2】:

    你有没有想过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
    

    也许需要进行一些细微的修改,但就是这样。可能也更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 2020-03-21
      • 2023-02-06
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 2013-09-04
      相关资源
      最近更新 更多