реклама на сайте
подробности

 
 
> Преобразование типов в Матлаб
AlexMad
сообщение Dec 26 2009, 21:42
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 262
Регистрация: 18-02-05
Из: SPb
Пользователь №: 2 743



Есть некоторый файл, в котором хранится структура параметров другого файла.

В матлабе я считываю этот файл, как массив байтов, потом пытаюсь разгрести.

Вот часть описания этой стуктуры

Код
struct VARIATIONAL_PARS_1
  {
     char TimeString[26];            // 26 байт - число и время завершения ввода данных
     WORD ChannelsMax;          // 2 байта - общее число каналов для выбранной платы
     WORD RealChannelsQuantity; // 2 байта - число введенных (активных) каналов
     QWORD  RealKadrsQuantity;    // 8 байт - число собранных кадров в формате 'unsigned __int64' (< 18.446.744.073.709.551.614)
     QWORD  RealSamplesQuantity;  // 8 байт - число собранных отсчетов в формате 'unsigned __int64' (< 18.446.744.073.709.551.614)
     long double TotalTime;       // 10 байт - время ввода в cекундах в формате 'LONG DOUBLE'
     double AdcRate;             // 8 байт - частота АЦП в кГц в формате 'DOUBLE'
     double InterkadrDelay;      // 8 байт - межкадровая задержка в млс в формате 'DOUBLE'
     double ChannelRate;         // 8 байт - частота сбора данных с одного канала в кГц в формате 'FLOAT'
     BOOL  ActiveAdcChannelArray[MAX_ADC_CHANNEL_QUANTITY];      // 4байта*32 - массив, каждый элемент
                                                // которого равен нулю или единице, единичное значение
                                                // соответствует тому, что данный вход активен


Строки и целые числа из считанного массива получить не проблема. А вот как преобразовать массив байтов в double средствами именно матлаб?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
Methane
сообщение Dec 26 2009, 21:45
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Не понял.
http://www.mathworks.com/access/helpdesk/h.../ref/fread.html

Сообщение отредактировал rezident - Dec 26 2009, 22:49
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post
AlexMad
сообщение Dec 26 2009, 22:13
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 262
Регистрация: 18-02-05
Из: SPb
Пользователь №: 2 743



Цитата(Methane @ Dec 27 2009, 00:45) *

Именно этим и пользуюсь, возможно, не использую все возможности?!

Просто тогда другой вопрос: как считать файл в структуру?


В Си без использования #pragma pack(1)
нормально не считывается, а как это же сделать на языке матлаба?




Код
fseek(fid,109,'bof')
tststr = fread(fid, 1, 'double')


Вот так работает. Но это не снимает вопроса про преобразование типов, ибо в структуре есть еще

Код
long double TotalTime;       // 10 байт - время ввода в cекундах в формате 'LONG DOUBLE'


Который надо как-то прочитать
Go to the top of the page
 
+Quote Post
Methane
сообщение Dec 26 2009, 22:18
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(AlexMad @ Dec 27 2009, 00:13) *
Просто тогда другой вопрос: как считать файл в структуру?

У вас какой-то бардак. Что мешает привети файл в тексторый вид, и работать уже с ним? Небольшая прога-перекодировщик и все.

Сообщение отредактировал rezident - Dec 26 2009, 22:50
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Dec 27 2009, 00:32
Сообщение #5


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(AlexMad @ Dec 27 2009, 00:42) *
long double TotalTime; // 10 байт - время ввода в cекундах в формате 'LONG DOUBLE'


Формат long double МатЛаб не поддерживает. И вообще этот тип данных попал под тотальный запрет, хотя и продолжает поддерживаться аппаратно в архитектуре x86. Однако я не об этом, а об избыточности применения такого типа данных в данном случае.
Даже если время измеряется с точность до 1 МИКРОсекунды, то это 6 десятичных знаков после запятой. В то время как обычный double (не long!) держит 16 десятичных знаков мантиссы. Это означает, что на целые секунды нам остается 16-6=10 десятичных знаков. А 10 в 10-ой степени это такое большое число секунд, которого хватит на 317 лет!
Поэтому можно смело менять в стуктуре тип long double на просто double, не опасаясь, что в ближайшие 317 лет потеряется 6-ой знак после запятой. А если автор темы доживет до тех лет, то ему останется еще 5 знаков после запятой, которых хватит на следующие 3 тысячелетия.
Go to the top of the page
 
+Quote Post
AlexMad
сообщение Dec 27 2009, 08:25
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 262
Регистрация: 18-02-05
Из: SPb
Пользователь №: 2 743



Цитата(Xenia @ Dec 27 2009, 03:32) *
Даже если время измеряется с точность до 1 МИКРОсекунды, то это 6 десятичных знаков после запятой. 


Я с Вами совершенно согласен, что это не нужно. Просто, есть накопленные данные, считанные устройством L-Card 14-440. В прилагаемой софтине данные именно так и хранятся (так что 317 лет жить собираются разработчики L-Carda, а не я), а сейчас я просто решил все их пересмотреть, заодно и с матлабом поразбираться. К слову сказать, само время записи мне не особо и нужно знать, его всегда можно получить, зная количество сэмплов и частоту АЦП.


Кстати - про неподдерживаемость long double спасибо за информацию, а то я долго не мог понять, почему у меня и написанная на Си утилита конвертирования не всегда правильно это время распознает.




Ну а про
Цитата
У вас какой-то бардак. Что мешает привети файл в тексторый вид, и работать уже с ним? Небольшая прога-перекодировщик и все.


Да ничего не мешает, просто захотелось разобраться с возможностями матлаба и сделать все в одном месте.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Dec 27 2009, 18:06
Сообщение #7


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(AlexMad @ Dec 27 2009, 11:25) *
Просто, есть накопленные данные, считанные устройством L-Card 14-440. В прилагаемой софтине данные именно так и хранятся (так что 317 лет жить собираются разработчики L-Carda, а не я), а сейчас я просто решил все их пересмотреть, заодно и с матлабом поразбираться.
Кстати - про неподдерживаемость long double спасибо за информацию, а то я долго не мог понять, почему у меня и написанная на Си утилита конвертирования не всегда правильно это время распознает.


Это смотря какой С-компилятор, есть и такие, которые понимают тип long double в 10-байтной кодировке. Это Borland С/Delfi и их потомки. Компилятор от Intel тоже может работать с таким форматом, только под этот тип он отводит 16 байт (из них 6 пустые). Может и еще какие есть, только мне они не известны. А остальные придерживаются соглашения не использовать типов данных, размер которых не кратен степени двойки. 10-ка сюда не входит. Поэтому они понимают long double как просто double. А Intel исхитрился не нарушить соглашение, но оставить этот тип, т.к. он есть в их процессорах.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 11:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016