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);