Проверка этой строки MATLAB:
no_bin_ele=m5(12039:2:12218)+256*m5(12040:2:12218);
В октаве я проверяю, что
12039:2:12218
производит 90 значений, 12039 до 12217.
12040:2:12218
также производит 90, 12040 до 12218
Таким образом, строка принимает суммирующие последовательные пары, m5[i]+256*m5[i+1]
Так как они были загружены как uint8
, это дает, я думаю, значение uint16
.
Но в numpy
:
In [467]: np.arange(12039,12218,2).shape
Out[467]: (90,)
In [468]: np.arange(12040,12218,2).shape
Out[468]: (89,)
Конечная точка обработки отличается. Конечная точка 2-го среза должна быть 12219.
Это объясняет ошибку трансляции, когда m5
является массивом (который должен быть):
no_bin_ele = m5[12039:12218:2]+256*m5[12040:12218:2]
Преобразование m5
tolist()
не помогает. Для списка *
означает репликацию, а +
означает объединение. Для массива это умножение и сложение. совершенно другой.
In [475]: alist = list(range(0,10))
In [476]: alist
Out[476]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [477]: alist[1:6:2] + 4*alist[2:6:2]
Out[477]: [1, 3, 5, 2, 4, 2, 4, 2, 4, 2, 4]
Остальная часть кода работает со списком, потому что индексирование и нарезка одинаковы - вплоть до выражения n1[1: ,1]
. Это действительно только для массива numpy.
На самом деле существуют другие проблемы с индексацией. Python Индексирование начинается с 0.
no_bin_ele(1) # 1st element of the matlab matrix
no_bin_ele[0] # 1st element of the array
n1(1:end,1) # matlab matrix is 2d
n1[1: ,1] # n1 isn't 2d
n1 # should just be
На самом деле я думаю, что последние несколько строк должны быть
s2=int(no_bin_ele[0]*7+4)*360)
n1=m6[:s2]
j1 = np.reshape(n1, (-1, 360)) # -1 stands in for no_bin_ele[0]*7+4
Хотя при таком изменении формы могут возникнуть order
проблемы. MATLAB является главным столбцом, как order='F'
, с последним измерением в крайнем случае.
Я действительно хотел бы увидеть некоторые примеры данных для проверки шагов. Есть ограничения на то, что я могу вывести, просто читая код. Но я не интересуюсь обработкой данных длиной 12218 байт.
Опять же, образец Octave:
>> n1 = 1:10;
>> reshape(n1, 5,2)
ans =
1 6
2 7
3 8
4 9
5 10
и numpy:
In [481]: n1 = np.arange(1,11)
In [482]: np.reshape(n1, (5,2))
Out[482]:
array([[ 1, 2],
[ 3, 4],
[ 5, 6],
[ 7, 8],
[ 9, 10]])
In [483]: np.reshape(n1, (5,2),order='F')
Out[483]:
array([[ 1, 6],
[ 2, 7],
[ 3, 8],
[ 4, 9],
[ 5, 10]])
In [484]: np.reshape(n1, (2,5))
Out[484]:
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
===
m5
- это файл, читаемый как uint8
, беззнаковые байты.
m6
- большая конечная часть, в которую мы хотим изменить форму (n, 360 ) матрица (или ее транспонирование).
no_bin_ele
- более ранняя часть, которая, очевидно, состоит из 2-байтовых чисел, и мы используем первую из них, чтобы выбрать срез m6
для этого изменения формы.
Возможно, было бы легче сделать этот перевод, если бы у нас было текстовое описание формата этого файла. Вывод поведения matlab без образца или описания, скорее всего, будет ошибочным.