2
votes

Utilisez regexprep avec un tableau de cellules pour formater les deux points

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?


0 commentaires

3 Réponses :


3
votes

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)


0 commentaires

3
votes

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


2 commentaires

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



2
votes

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


0 commentaires