То, что делает код MATLAB, это неявное расширение матрицы каждый раз через цикл.Точнее говоря, каждый раз создается новая матрица, которая на один элемент длиннее, затем копируются все данные из старой матрицы в новую, а затем удаляется старая.
Python не позволяет вам сделать это, потому что он медленный и может быть опасным.Вам нужно сначала создать массив нужного размера (если вы используете пустые массивы), или вам нужно явно увеличить размер (если вы используете список).Обратите внимание, что это также медленно и опасно в MATLAB, поэтому новые версии редактора MATLAB будут кричать на вас, если вы делаете что-то подобное.
Если вы адаптируете код MATLAB, вы, вероятно, захотите использовать numpy.Итак, вот эквивалентный код Python:
import numpy as np
from numpy.random import random
from scipy.signal import correlate2d
correlation_h = np.zeros(len(message_vector))
correlation_v = np.zeros(len(message_vector))
correlation = np.zeros(len(message_vector))
for kk in range(len(message_vector)):
pn_sequence_h = np.round(2*(random([Mw//2, Nw//2])-0.5))
pn_sequence_v = np.round(2*(random([Mw//2, Nw//2])-0.5))
correlation_h[kk] = np.corrcoef(cH1, pn_sequence_h)
correlation_v[kk] = np.corrcoef(cV1, pn_sequence_v)
correlation[kk] = (correlation_h[kk]+correlation_v[kk])/2
Однако вы можете упростить это, векторизовав сложение и используя numpy.random.uniform
для получения случайных значений от -1 до 1
import numpy as np
from numpy.random import random
message_len = len(message_vector)
correlation_h = np.zeros(message_len)
correlation_v = np.zeros(message_len)
for kk in range(message_len):
pn_seq_h, pn_seq_v = np.round(uniform(-1, 1, [2, Mw//2, Nw//2]))
correlation_h[kk] = np.corrcoef(cH1, pn_seq_h)
correlation_v[kk] = np.corrcoef(cV1, pn_seq_v)
correlation = (correlation_h+correlation_v)/2
Тем не менее, это почти наверняка не то, что вы на самом деле хотите.Попробуйте это в MATLAB:
histogram(round(2*(rand(1,1000)-.5)))
Вы увидите, что значения -1 и +1 менее вероятны, чем значение 0.Вы почти наверняка хотите равномерное распределение случайных значений, которое вы можете получить с помощью этого:
import numpy as np
from numpy.random import randint
message_len = len(message_vector)
correlation_h = np.zeros(message_len)
correlation_v = np.zeros(message_len)
for kk in range(message_len):
pn_seq_h, pn_seq_v = randint(-1, 2, [2, Mw//2, Nw//2])
correlation_h[kk] = np.corrcoef(cH1, pn_seq_h)
correlation_v[kk] = np.corrcoef(cV1, pn_seq_v)
correlation = (correlation_h+correlation_v)/2
Если это не приводит к слишком большому массиву, вы можете даже создать все случайные числа одновременно, позволяя вам многое упростить:
import numpy as np
from numpy.random import randint
message_len = len(message_vector)
correlation_h = np.zeros(message_len)
correlation_v = np.zeros(message_len)
for kk in range(message_len):
pn_seqs = randint(-1, 2, [message_len, 2, Mw//2, Nw//2])
for kk, (pn_seq_h, pn_seq_v) in enumerate(pn_seqs):
correlation_h[kk] = np.corrcoef(cH1, pn_seq_h)
correlation_v[kk] = np.corrcoef(cV1, pn_seq_v)
correlation = (correlation_h+correlation_v)/2