J'ai un tableau de cellules formaté comme:
a = regexprep(t,':34:22.959511', '')
J'essaie de formater la sortie en 4 vecteurs colonnes comme:
a = 23 22 12 11 b = 34 34 34 34 c = 22 11 08 02 d = 959511 885113 995146 383092
J'utilise regexprep
pour opérer sur les données:
t = {'23:34:22.959511'; '22:34:11.885113'; '12:34:08.995146'; '11:34:02.383092'}
Cependant, cela ne concerne qu'une seule chaîne dans l'ensemble de données et pas toutes les chaînes.
Comment diviser la chaîne en 4 vecteurs de colonnes - en utilisant regexprep
pour deux points: et afficher la sortie ci-dessous?
3 Réponses :
Si vous souhaitez utiliser d'autres solutions qui regexp: strplit
peut se diviser sur n'importe quel caractère désiré:
a = zeros(numel(t),1); b = zeros(numel(t),1); c = zeros(numel(t),1); d = zeros(numel(t),1); for ii = 1:numel(t) C = strsplit(t{ii}, ':'); a(ii) = str2double(C{1}); b(ii) = str2double(C{2}); tmp = strsplit(C{3},'.'); % Additional split for dot c(ii) = str2double(tmp{1}); d(ii) = str2double(tmp{2}); end
Bien sûr, cela ne fonctionne que lorsque vos données ont toujours cette structure (deux deux points, puis un point)
Voici un moyen:
r = num2cell(r,1); [a, b, c, d] = r{:};
Cela donne
r = 23 34 22 959511 22 34 11 885113 12 34 8 995146 11 34 2 383092
Si vous avez vraiment besoin de quatre variables distinctes, vous pouvez utiliser: p >
r = cell2mat(cellfun(@str2double, regexp(t, ':|\.', 'split'), 'uniformoutput', false));
Pour accélérer l'obtention des quatre variables, ne serait-il pas plus rapide de ne pas convertir votre première ligne de r
en matrice, mais d'utiliser la cellule directement? Donc au lieu de num2cell (cell2mat (cellfun (..)))
faites directement cellfun (..)
, ou les dimensions / éléments sont-ils alors dans un mauvais ordre?
@Adriaan Oui, les dimensions seraient dans le mauvais ordre. Nous devons les transposer. C'est essentiellement ce que font cell2mat
et num2cell
: cell2mat
convertit en matrice, et num2cell
extrait ses colonnes
Je recommanderais d'utiliser split au lieu de strsplit. split fonctionnera sur les vecteurs et si vous utilisez le type de données chaîne, vous pouvez simplement appeler double sur la chaîne pour obtenir la valeur numérique
>> profFunc Adriaan's Solution: 5.299892 Luis Mendo's Solution: 3.449811 My Solution: 0.094535 function profFunc() n = 1e4; % Loop to get measurable timings t = ["23:34:22.959511"; "22:34:11.885113"; "12:34:08.995146"; "11:34:02.383092"]; tic for i = 1:n a = zeros(numel(t),1); b = zeros(numel(t),1); c = zeros(numel(t),1); d = zeros(numel(t),1); for ii = 1:numel(t) C = strsplit(t{ii}, ':'); a(ii) = str2double(C{1}); b(ii) = str2double(C{2}); tmp = strsplit(C{3},'.'); % Additional split for dot c(ii) = str2double(tmp{1}); d(ii) = str2double(tmp{2}); end end fprintf('Adriaan''s Solution: %f\n',toc); tic for i = 1:n r = cell2mat(cellfun(@str2double, regexp(t, ':|\.', 'split'), 'uniformoutput', false)); r = num2cell(r,1); [a, b, c, d] = r{:}; end fprintf('Luis Mendo''s Solution: %f\n',toc); tic for i = 1:n x = split(t,[":" "."]); x = double(x); a = x(:,1); b = x(:,2); c = x(:,3); d = x(:,4); end fprintf('My Solution: %f\n',toc);