Matlab to Python; Преобразование шестнадцатеричного адреса в десятичный массив numpy - PullRequest
0 голосов
/ 02 марта 2020

Возможно, это сделано в несколько строк, но я в настоящее время застрял на следующей проблеме:

Я хочу перенести операцию matlab на python. Matlab выглядит так:

startAddress = hex2dec('00D00000');
address = hex2dec(flipud((reshape(dec2hex(address, 8), 2, 4))'));

Так что я получаю 2D-вектор с десятичными числами из этого. Самое близкое, что я могу передать это python, это:

import numpy as np

startAddress = int('00D00000', 16)
address = startAddress.to_bytes(8, 'little')
address = np.frombuffer(addressMsg, dtype=np.uint8)
address = address[0:4].reshape(4,1)

Это эквивалентно? Остальная часть моего кода не работает должным образом и является довольно сложной, поэтому я хотел выяснить, есть ли моя ошибка здесь или где-то глубже.

1 Ответ

1 голос
/ 02 марта 2020

MATLAB и Python решения эквивалентны.

Единственное отличие, которое я заметил, состоит в том, что результат MATLAB относится к классу double, а в Python элементы ndarray имеют тип uint8.
(различия в типах, вероятно, не имеют значения).

Есть небольшие проблемы с отправленным вами примером кода, который делает его неисполняемым:

  • Код MATLAB должен быть: dec2hex(startAddress, 8) вместо dec2hex(address, 8).
  • Код Python должен быть: np.frombuffer(address, вместо np.frombuffer(addressMsg,.

Вы можете получить тот же результат, используя более простой код:

В MATLAB вы можете использовать typecast:

address = double(typecast(uint32(startAddress), 'uint8')');

Пример кода для тестирования :

startAddress = hex2dec('12345678');
address = hex2dec(flipud((reshape(dec2hex(startAddress, 8), 2, 4))'));

address2 = double(typecast(uint32(startAddress), 'uint8')');

В Python можно использовать struct.pack:

address = np.frombuffer(struct.pack("<I", startAddress), np.uint8).reshape(4,1)

Пример кода для тестирования:

startAddress = int('12345678', 16)
address = startAddress.to_bytes(8, 'little')
address = np.frombuffer(address, dtype=np.uint8)
address = address[0:4].reshape(4,1)

# Convert startAddress array of 4 uint8 elements (apply little endian format).
address2 = np.frombuffer(struct.pack("<I", startAddress), np.uint8).reshape(4,1)

Результат выполнения MATLAB:

address =

   120
    86
    52
    18

address2 =

   120
    86
    52
    18

Python Результат выполнения:

address
array([[120],
       [ 86],
       [ 52],
       [ 18]], dtype=uint8)

address2
array([[120],
       [ 86],
       [ 52],
       [ 18]], dtype=uint8)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...