Поскольку ваши данные имеют 16-разрядную подпись, я думаю, что наиболее элегантное решение - использовать typecast (как прокомментировал Энди).
Для правильной работы решения Typecast вы должны сделать следующее:
- Привести каждое значение к
uint8
- Создать массив из двух
uint8
элементы (поместите сначала нижний элемент, потому что наши системы little-endian ) - Используйте
typecast
для преобразования двух байтов в один элемент int16
. - Приведите результат к
double
(вы можете пропустить эту часть, но это обычная практика - на случай, если вам нужно применить вычисления к результату).
Пример кода:
high = 254;
low = 144;
res = double(typecast([uint8(low), uint8(high)], 'int16'))
Результат:
res = -368
В случае, если вы хотите использовать чисто математические операции (как прокомментировал Сами),Вы можете сделать это следующим образом:
res = high*256 + low;
if (res >= 2^15)
res = res - 2^16; %Correct the sign.
end
Я нахожу это менее элегантным, потому что утверждение if
неясно ...
Вы также можете использовать битное смещение, bitor
и typecast
(как прокомментировал Крис).
Похоже, код C res = (short)((high << 8) | low)
:
res = typecast(uint16(bitor(bitshift(high, 8), low)), 'int16');
Я считаю это менее элегантным, чем первое решение, потому что сдвиги или операции не являются естественными в MATLAB / Octave ...