Используйте regexprep с массивом ячеек для форматирования двоеточий - PullRequest
2 голосов
/ 16 апреля 2019

У меня есть массив ячеек, отформатированный как:

t = {'23:34:22.959511';
     '22:34:11.885113';
     '12:34:08.995146';
     '11:34:02.383092'}

Я пытаюсь отформатировать вывод как 4 столбца векторов как:

a = 23
    22
    12
    11

b = 34
    34
    34
    34

c = 22
    11
    08
    02

d = 959511
    885113
    995146
    383092

Я использую regexprep для работы с данными:

a = regexprep(t,':34:22.959511', '')

Однако это относится только к одной строке в наборе данных, а не ко всем строкам.

Как разделить строку на 4 вектора столбцов - используя regexprep для двоеточия: и отобразить вывод ниже?

Ответы [ 3 ]

3 голосов
/ 16 апреля 2019

Вот способ:

r = cell2mat(cellfun(@str2double, regexp(t, ':|\.', 'split'), 'uniformoutput', false));

Это дает

r =
          23          34          22      959511
          22          34          11      885113
          12          34           8      995146
          11          34           2      383092

Если вам действительно нужны четыре отдельные переменные, вы можете использовать:

r = num2cell(r,1);
[a, b, c, d] = r{:};
3 голосов
/ 16 апреля 2019

Если вы хотите использовать другие решения, которые regexp: strplit может разделиться на любой желаемый символ:

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

Конечно, это работает только тогда, когда ваши данные всегда имеют такую ​​структуру (две двоеточия, затем одна точка)

2 голосов
/ 19 апреля 2019

Я бы порекомендовал использовать split вместо strsplit.split будет работать с векторами, и если вы используете строковый тип данных, вы можете просто вызвать double в строке, чтобы получить числовое значение

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