有什么方法可以让我对此进行矢量化吗?
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}) );
答案 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
可能需要稍作修改,但这就是方法。可能也更快。