Преобразование ячейки в матрицу, которая содержит текст?

У меня есть текстовый файл, который содержит данные измерений, заголовок не так важен, поэтому я использовал это, чтобы удалить первые 25 строк

% Skip the first 25 lines
for i=1:25
fgetl(inputfile);
end

Затем я использовал разделитель, чтобы получить данные

   delimiter = '';
   values = textscan(inputfile, '%s', 'delimiter', delimiter);

Я пытаюсь преобразовать ячейку, которая состоит из 1000 символов, как показано ниже. Вот что я получил

'2014_11_03_17-19-49 000 430114 516672 960.91 26.2'
'2014_11_03_17-19-49 001 430112 516656 960.91 26.2'
'2014_11_03_17-19-49 002 430112 516656 960.91 26.2'
'2014_11_03_17-19-49 003 430112 516656 960.91 26.2'

Я пытаюсь преобразовать ячейку, которая состоит из 1000 символов, как и в предыдущем, я касаюсь только (960.91 и 26.2) значений.

Я пытался преобразовать его в матрицу, но я получил

эта ошибка не может поддерживать массивы ячеек, содержащие массивы ячеек или объекты.

Любая идея, как просто получить эти значения в матрицу для их построения.

2 ответа

Решение

Подход № 1

Вы можете использовать отличный importdata Вот -

lines_skip = 25;
values = importdata(inputfile,' ',lines_skip) %// using the delimiter ' ' here

values будет структура, содержащая данные из inputfile,

Таким образом, fourth column было бы values.data(:,4), в то время как values.data(:,5) будет fifth один, как показано здесь -

>> values.data(:,4)
ans =
  960.9100
  960.9100
  960.9100
  960.9100
>> values.data(:,5)
ans =
   26.2000
   26.2000
   26.2000
   26.2000

Подход № 2

Если у вас уже есть массив ячеек, указанный в вопросе, вам не нужно беспокоиться о повторном чтении входного файла. Итак, у вас есть что-то вроде этого -

incell = {
    '2014_11_03_17-19-49 000 430114 516672 960.91 26.2'
    '2014_11_03_17-19-49 001 430112 516656 960.91 26.2'
    '2014_11_03_17-19-49 002 430112 516656 960.91 26.2'
    '2014_11_03_17-19-49 003 430112 516656 960.91 26.2'}

Далее вы можете использовать cellfun с regexp разбить каждую ячейку на столбцы с помощью разделителя ' ' -

cellarr = cellfun(@(x) regexp(x,' ','Split'),incell,'un',0)
values = vertcat(cellarr{:})

который получит вас -

values = 
    '2014_11_03_17-19-49'    '000'    '430114'    '516672'    '960.91'    '26.2'
    '2014_11_03_17-19-49'    '001'    '430112'    '516656'    '960.91'    '26.2'
    '2014_11_03_17-19-49'    '002'    '430112'    '516656'    '960.91'    '26.2'
    '2014_11_03_17-19-49'    '003'    '430112'    '516656'    '960.91'    '26.2'

То есть пятый и шестой столбцы из values будут данные, которые вы хотели иметь после упаковки str2double вокруг них: str2double(values(:,5)) а также str2double(values(:,6)),

Используйте другой спецификатор формата с textscan 'HeaderLines' Возможность пропустить заголовок напрямую:

>> fid = fopen('testtext.txt','r','HeaderLines',25)
>> C = textscan(fid,'%s %d %d %d %f %f')
C = 
    {4x1 cell}   [4x1 int32]   [4x1 int32]   [4x1 int32]   [4x1 double]   [4x1 double]
>> fclose(fid);
>> C{5}

  960.9100
  960.9100
  960.9100
  960.9100

Сделайте матрицу путем конкатенации, если вы хотите это так:

>> M =[C{5} C{6}]
M =

  960.9100   26.2000
  960.9100   26.2000
  960.9100   26.2000
  960.9100   26.2000

Вы даже можете указать, чтобы игнорировать все, кроме результатов, которые вы хотите:

C = textscan(fid,'%*s %*d %*d %*d %f %*f')
C = 
    [4x1 double]

Не забудь fclose(fid) или же fclose all если ты потерял ручку

Другие вопросы по тегам