我正在尝试将以下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中创建一个列表,它将保存每个数字的值。 (kk
)。我对python很新,所以我很困惑。请帮助。
答案 0 :(得分:2)
MATLAB代码正在做的是每次循环时隐式扩展矩阵。或者更具体地说,它是每次更长一个元素时创建一个新矩阵,然后将旧矩阵中的所有数据复制到新矩阵,然后删除旧矩阵。
Python不允许你这样做,因为它很慢并且可能很危险。您需要最初创建所需大小的数组(如果使用numpy数组),或者需要显式增加大小(如果使用列表)。请注意,这在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