我正在将MATLAB代码转换为Python。
这是我在python中的代码。
import numpy as np
import math
n=150
L=1
inter=L/n
y=np.linspace(inter/2,L-inter/2,n).transpose()
E=(210000000000)*np.ones(n)
Rho=7800*np.ones(n)
PI=math.pi
A=np.exp( 5+2*y*(np.sin(2*PI*y/L)) )*0.000001
在这之前都很好,没有任何数值上的差异,也没有任何问题 直到我不得不执行这段MATLAB代码。
Mass=sum(Rho*inter.*A)
我试着用 np.sum(Rho*inter*A)
而只是 Rho*inter*A
第一个案例我得到了一个答案 1.0626206716847877
但MATLAB返回一个150元素的数组。
在scond的情况下,我得到了一个 ndarray
像我想要的,但值是不一样的,我在MATLAB中得到的。
我在MATLAB中得到的值。matlab的值粘贴栏
我在python中得到的值。python values pastebin
我做错了什么?
(Rho[:,None]*inter*A).sum(axis=0)
匹配你的MATLAB pastebin。
或者使用 einsum
来整理轴。
np.einsum('i,j->j', Rho,inter*A)
这只是减少。
Rho.sum() * inter*A
这真的是你在MATLAB里要做的事情吗?
如果您展示一下用于创建的实际MATLAB代码,可能会有所帮助 Rho
, A
等。
Mass=sum(Rho*inter.*A)
规模有多大 Rho
和 A
在MATLAB中? 一个可能是[1x150],但另一个? 是 Rho
也有[1x150],或[150x150]。 〔150x150〕。*
是矩阵乘法,就像 @
在numpy中,但 .*
是元素方面。
在 numpy
编码 y
, Rho
和 A
都有形状(150,)。 上的转置。y
什么也不做。 Rho*inter*A
是元素乘法,也会产生一个(150,)。
NumPy总是对一个矩阵的所有元素进行求和。MATLAB的默认值是基于列的,也就是说,所有150个列的总和是一个单一的总和,因此是数组。使用 sum(matrix,'all');
在MATLAB中,对矩阵中的所有元素进行求和。如果您的MATLAB比2018b老,请使用 sum(matrix(:))
即把你的矩阵存储在一个临时变量中,然后在求和之前把它压平为一列。
在Python中,如果要在列上求和,请指定轴,是0。np.sum(matrix,axis=0
)
轴:进行求和的轴。默认情况下,axis=None,将对输入数组的所有元素进行求和。
sum()
从MATLAB中获得。
S = sum(A)
返回MATLAB中元素的和。A
的第一个数组维度,其大小不等于1
. 如果A
是一个矩阵,那么sum(A)
返回一个包含各列之和的行向量。S = sum(A,'all')
计算所有元素的和。A
. 此语法对MATLAB® R2018b及以后的版本有效。
为了防止这种不清晰的情况发生,我喜欢总是指定在哪个方向上求和,即 sum(matrix,1)
对于MATLAB和 np.sum(matrix,axis=0)
的NumPy,不管默认情况如何。
我认为在MATLAB中使用 sum
在一个矩阵上,你将得到它的各个列的总和,最终你将得到一个元素数等于列数的数组。再用一个 sum
在MATLAB中的命令。sum(sum(M))
,这相当于 np.sum(M)
在Python中。