Как предварительно выделить массив в Python для цикла? - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь преобразовать следующий код Matlab в код Python.Я конвертировал более 50% файла, но застрял на этом этапе.В MATLAB: -

for kk=1:length(message_vector)
    pn_sequence_h=round(2*(rand(Mw/2,Nw/2)-0.5));
    pn_sequence_v=round(2*(rand(Mw/2,Nw/2)-0.5));
    correlation_h(kk)=corr2(cH1,pn_sequence_h);
    correlation_v(kk)=corr2(cV1,pn_sequence_v);
    correlation(kk)=(correlation_h(kk)+correlation_v(kk))/2;
end

В Python-

for kk in range(1,len(message)):
    pn_sequence_h = random.sample(range(1000,100000),k = int(math.ceil(Mc/2.0)) * int(math.ceil(Nc/2.0)))
    for i in range(len(pn_sequence_h)):
        pn_sequence_h[i] = round(2*(pn_sequence_h[i]*0.00001 - 0.5))*0.06
        correlation=[]
        correlation.append[kk]=corr2(cD,pn_sequence_h[i])

Я хочу изменить correlation_h(kk)=corr2(cH1,pn_sequence_h); строку на Python, что я уже сделал, но не работал.

ИтакЯ хочу сделать список в Python, который будет сохранять значения для каждого числа.(* 1 010 *).Я очень плохо знаком с Python, поэтому я так запутался.Пожалуйста, помогите.

1 Ответ

0 голосов
/ 04 июня 2018

То, что делает код 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...