Matlab循环到Python循环的转换

vc9ivgsu  于 2022-11-24  发布在  Matlab
关注(0)|答案(1)|浏览(200)

我正在尝试将以下Matlab代码转换为Python:

for j=1:n
    for i=1:m
        a1(i,j) = sum(-4*f*d(i))*log(NormPS{i,j}(f1:f2)));
    end
end

其中n=55且m=103; F具有1 × 441维矩阵(考虑任何随机值)F1=10和F2=450,且X1 M0 N1 X给出441 × 1维矩阵,而X1 M1 N1 X是1 × 103维矩阵。
下面是我在Python中尝试的内容:

for j in range(np.int64(n)):
    for i in range(np.int64(m)): 
        a= -np.mat(4)*np.mat(f)*np.mat(d[:i])
        b=np.log((NormPS[i,j] [(d).astype(int)]).reshape(-1,1))
        #check=(d[:i])

我在Matlab的log部分得到了相同的结果,在我的python代码中是b。但是,对于sum部分,我得到了这个错误error : shapes (1,441) and (0,103) not aligned: 441 (dim 1) != 0 (dim 0)

Traceback (most recent call last): 
File ~\Desktop\spyder_files\2D_spyder_file\algebra_2D_spyder.py:48 in <module> a= -np.mat(4)*np.mat(f)*np.mat(d[:i])
File ~\anaconda3\lib\site-packages\numpy\matrixlib\defmatrix.py:218 in mul return N.dot(self, asmatrix(other))
File <__array_function__ internals>:5 in dot ValueError: shapes (1,441) and (0,103) not aligned: 441 (dim 1) != 0 (dim 0)

有什么方法可以重写a=sum(-4*f*d(i))吗?我确信错误在d(i)中。

jutyujz0

jutyujz01#

首先,Numpy建议不再使用Matrix类。
同样,你在Matlab中使用d(i),在Python中使用d[:i],它们是不等价的。Matlab的d(i)将返回数组d中的单个元素。d[:i]是从索引0到索引i的切片。
示例:

d = np.array([1,2,3,4])
i = 2
print(d[:i])
[1, 2]

print(d[i])
3

我认为,如果fd的尺寸如你所说,那么你要寻找的是:

import numpy as np
f = np.random.rand(1,441)
d = np.random.rand(1,103)

#Set i just for the example:
i = 1
a= -4*f*d[0,i]
print(f'The Shape of "a" is: {a.shape}')

退货:

The Shape of "a" is: (1, 441)

但是,根据您包含的错误消息,看起来d实际上是(0,103) ...如果是这种情况,请在上述代码中将d[0,i]更改为d[i],这样应该可以正常工作。

相关问题