Я пытаюсь прочитать определенный текстовый файл в Matlab и хранить только значения float в матрице Matlab. Я нашел несколько разных способов сделать это, но никто не работает так, как я хочу. Я думаю, что проблема заключается в форматировании текстового файла. Вот первые несколько строк файла:Базовый файл ввода/вывода в Matlab
**K = 1, J = 1
37.9072 37.9072 37.872 37.9072 37.9072 37.5572 37.9072
37.9072 37.9172 37.9072 37.962 37.9552 37.9072
37.9222 37.9072 37.9322 37.9072 37.9332 37.9072
** K = 2, J = 1
34.9249 34.9249 34.9349 34.9249 34.9679 34.9249 34.9249
34.9249 34.2439 34.9249 34.9249 34.9249 34.9249
34.9459 34.9249 34.9549 34.9249 34.6749 34.9889
**K = 3, J = 1
37.94501 37.94401 37.94501 37.94501 37.99501 37.96501 37.94501
37.94501 37.94101 37.93301 37.94501 37.94501 37.94501
37.94501 37.90501 37.94501 37.90001 37.94501 37.99801
вопросы, которые я имею в том, что: 1) каждый номер не разделены табуляцией, а вместо этого разделены несколькими пробелами, и 2) в первой строке каждой строки после «**» содержит 7 столбцов данных, а последующие строки содержат только 6 столбцов данных. Я могу читать строки, которые я хочу использовать tline = fgetl (fid), но как я могу извлечь плавающие значения в tline, чтобы я мог назначить их в вектор Matlab?
В идеале, что бы я хотел иметь для каждого блока данных, разделенных символом «**», код ввода-вывода читает это в вектор Matlab. Например, для первого блока К = 1, J = 1, я бы вектор:
VEC1 = [37,9072 37,9072 37,9072 37,9072 37.9072 ...]
а затем в течение второго блока К = 2 , J = 1, я бы:.
VEC = [37,9429 37,9429 37,9429 37,9429 37,9429 37.9429 ...]
каждый вектор, VEC были бы размером [1 19] (т.е. 19 точек данных в каждом блок данных). Ниже приведена моя попытка решить проблему (что неверно):
fid = fopen('Temp2017-01-01.txt');
m = 1;
while ischar(tline)
if(tline(1) == '*') %to skip lines which start with '*'
tline = fgetl(fid);
elseif(length(tline) > 112) %to get the line containing 7 columns of data
vec(m, :) = sscanf(tline(1:end), '%f,%f,%f,%f,%f,%f,%f')
else %to get the lines containing 6 columns of data
vec(m, :) = sscarf(tline(1:end), '%f,%f,%f,%f,%f,%f,%*s')
end
m = m + 1;
end
fclose(fid);
Любые советы будут оценены. Спасибо,
EDIT: Я все еще не могу заставить это работать даже с помощью текстового экрана, как предложил Хоки (спасибо кстати). Сообщения об ошибках, которые я получаю: 1) Неправильное назначение с прямоугольной пустой матрицей и 2) Невозможно поддерживать массивы ячеек, содержащие массивы ячеек или объекты. Кроме того, назначение М = cell2mat (г) возвращает что-то вроде:
NaN NaN NaN NaN NaN NaN NaN NaN 37,9828800000000 NaN NaN NaN NaN NaN NaN NaN 37.9828800000000
Я забыл дать понять, что между каждым поплавком в текстовом файле примера выше, есть 8 пробелов. Когда я использую textscan, он возвращает массив ячеек строк. Каждая строка что-то вроде:
'37.9072 37.9072 37.9072 ...'
Я хотел бы извлечь каждую из этих отдельных записей в вектор или матрицу. После чтения ошибок я получаю одно объяснение, что cell2mat работает только для нестроковых записей. Любые дальнейшие советы очень ценятся.
Спасибо,
Спасибо Хоки. Я последовал твоему предложению, но до сих пор не могу заставить это работать (см. Выше). – AJA
@ AJA. cell2mat работает только на числовые значения. Обновите свой пост, чтобы показать несколько строк вашего текстового файла точно так, как они есть, иначе будет слишком много проб и ошибок. Также укажите, является ли шаблон строк согласованным (всегда одинаковым) или иногда другим. – Hoki