Преобразование ячейки в матрицу, которая содержит текст?
У меня есть текстовый файл, который содержит данные измерений, заголовок не так важен, поэтому я использовал это, чтобы удалить первые 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
если ты потерял ручку