Matlab fscanf считывает два столбца символа / шестнадцатеричные данные из текстового файла - PullRequest
0 голосов
/ 11 сентября 2018

Необходимо читать данные, хранящиеся в виде двух столбцов шестнадцатеричных значений в текстовом файле temp.dat, в переменную Matlab с 8 строками и двумя столбцами.

Хотелось бы придерживаться метода fcsanf.

temp.dat выглядит следующим образом (8 строк, два столбца):

0000 7FFF
30FB 7641
5A82 5A82
7641 30FB
7FFF 0000
7641 CF05
5A82 A57E
30FB 89BF

% Matlab code
fpath = './';
fname = 'temp.dat';
fid = fopen([fpath fname],'r');
% Matlab treats hex a a character string
formatSpec = '%s %s';
% Want the output variable to be 8 rows two columns
sizeA = [8,2];
A = fscanf(fid,formatSpec,sizeA)
fclose(fid);

Matlab производит следующее, котороеЯ не ожидаю.

A = 8 × 8 массив символов

'03577753'
'00A6F6A0'
'0F84F48F'
'0B21F12B'
'77530CA8'
'F6A00F59'
'F48F007B'
'F12B05EF'

В другом варианте я попытался изменить строку формата следующим образом

formatSpec = '%4c %4c';

произвел этот вывод:

A =

8 × 10 массив символов

'0↵45 F7↵78'
'031A3F65E9'
'00↵80 4A↵B'
'0F52F0183F'
'7BA7B0C20 '
'F 86↵0F F '
'F724700AB '
'F6 1F↵55  '

Еще один вариант, подобный этому:

formatSpec = '%4c %4c';
sizeA = [8,16];
A = fscanf(fid,formatSpec);

Производит одинмассивом из 76 символов:

A =

'00007FFF
 30FB 7641
 5A82 5A827641 30FB
 7FFF 0000
 7641CF05
 5A82 A57E
 30FB 89BF'

Хотел бы и ожидал, что Matlab создаст переменную рабочей области с 8 строками и 2 столбцами.

Следовали примеру наобласть справки Matlab здесь: https://www.mathworks.com/help/matlab/ref/fscanf.html

Мой код Matlab основан на разделе «чтение содержимого файла в массив» примерно на 1/3 пути вниз по странице.Пример, на который я ссылаюсь, делает нечто очень похожее, за исключением того, что два столбца - это один int и один float, а не два символа.

Запуск Matlab R2017a на Redhat.

Вот полный код сРешение предоставлено Azim и комментарии о том, что я узнал в результате публикации вопроса.

fpath = './';
fname = 'temp.dat';
fid = fopen([fpath fname],'r');
formatSpec = '%9c\n';
% specify the output size as the input transposed, NOT the input.
sizeA = [9,8];
A = fscanf(fid,formatSpec,sizeA);
% A' is an 8 by 9 character array, which is the goal matrix size.
% B is an 8 by 1 cell array, each member has this format 'dead beef'.
%
% Cell arrays are data types with indexed data containers called cells, 
%  where each cell can contain any type of data.
B = cellstr(A');
% split divides str at whitespace characters.
S = split(C)
fclose(fid)

S =

8 × 2 массив ячеек

'0000'    '7FFF'
'30FB'    '7641'
'5A82'    '5A82'
'7641'    '30FB'
'7FFF'    '0000'
'7641'    'CF05'
'5A82'    'A57E'
'30FB'    '89BF'

1 Ответ

0 голосов
/ 12 сентября 2018

Вероятно, ваша переменная 8x2 MATLAB окажется массивом ячеек.Это можно сделать в два этапа.

Во-первых, ваши строки состоят из 9 символов, поэтому вы можете использовать formatSpec = '%9c\n' для чтения каждой строки.Далее вам нужно настроить параметр размера, чтобы прочитать 9 строк и 8 столбцов;sizeA = [9 8].Это будет читать все 9 символов в столбцы вывода;транспонирование вывода приблизит вас.

На втором шаге вам нужно преобразовать результат fscanf в массив ячеек 8x2.Поскольку у вас есть R2017a, вы можете использовать cellstr и split, чтобы получить свой результат.

Наконец, если вам нужны целочисленные значения каждого шестнадцатеричного значенияВы можете использовать hex2dec для каждой ячейки в массиве ячеек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...