gpt4 book ai didi

python - 在 Python 中对矩阵执行幂运算

转载 作者:行者123 更新时间:2023-11-30 22:42:38 25 4
gpt4 key购买 nike

我有以下矩阵 m。

m =

0 0 0 0
0 1 2 3
0 2 4 6
0 3 6 9

我正在尝试使用 Python 执行等效的 MATLAB 操作。

new_m = w.^m 

即将 m 转换为以下矩阵:

new_m =

1 1 1 1
1 w^1 w^2 w^3
1 w^2 w^4 w^6
1 w^3 w^6 w^9

目前我的 Python 方法如下:

    N=4
w=cmath.exp(2*pi) # Here w = 535.491655525+0j
row=list(range(N)) # In this case row = [0, 1, 2, 3]

#Create the matrix and perform operation on it
m = [[0]*N for i in range(N)]
for x in range(1,q):
for entry in row:
m[x][entry]=entry*r # <--- This gives me give me the above matrix m

# This was my attempt to perform the new_m=w.^m operation
for x in range(0,q):
for entry in row:
element=M[x][entry]
new_m[x][entry]=w**element # <--- This should give me the correct new_m matrix described above

我的 Python 代码给出了以下结果:

[ [  1.0000e+00+0.j   1.0000e+00+0.j   1.0000e+00+0.j   1.0000e+00+0.j]
[ 1.0000e+00+0.j 5.3549e+02+0.j 2.8675e+05+0.j 1.5355e+08+0.j]
[ 1.0000e+00+0.j 2.8675e+05+0.j 8.2226e+10+0.j 2.3579e+16+0.j]
[ 1.0000e+00+0.j 1.5355e+08+0.j 2.3579e+16+0.j 3.6205e+24+0.j]]

但是,如果我在 MATLAB 中执行此操作,它会给出 new_m = w.^m 操作的答案:

new_m =

1.0e+24 *

0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 3.6205

我不确定为什么这些答案不同,以及我认为我的 python 代码中存在错误的地方。任何意见或建议将不胜感激!

注意:我还尝试在第一组 for 循环之后使用以下命令(使用 m 矩阵):

new_m = w**m

但这产生了错误:

TypeError: unsupported operand type(s) for ** or pow(): 'complex' and 'list'

最佳答案

首先:您的 Python 代码和输出都是正确的 - 如果您检查输出,会发生什么情况:Matlab 仅显示矩阵的其他数字被四舍五入打印的值“0”,因为它对所有 Matrix 成员使用单个指数 (e+24)。

另一方面,Python 的输出可以正确打印每个数字及其本身的大小。因此, "2.3579e+16+0.j "是一个比 "3.6205e+24+0.j]"小 10**8 倍的数字,并且由于 Matlab 对所有内容都使用 e+24 指数,因此它只打印0. 不过,它在内部存储了正确的值。

第二:您应该使用 Numpy ( http://numpy.org ) - 除了其他几个功能之外,它确实提供了开箱即用的矩阵算术。

对于你的电源操作,例如::

In [1]: import numpy as np

In [2]: z = np.array(range(9))

In [3]: z
Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8])

In [4]: z.shape = (3,3)

In [5]: z
Out[5]:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])

In [10]: w = cmath.exp(2*cmath.pi)

In [11]: w
Out[11]: (535.4916555247646+0j)

In [12]: w ** z
Out[12]:
array([[ 1.00000000e+00+0.j, 5.35491656e+02+0.j, 2.86751313e+05+0.j],
[ 1.53552935e+08+0.j, 8.22263156e+10+0.j, 4.40315059e+13+0.j],
[ 2.35785040e+16+0.j, 1.26260921e+19+0.j, 6.76116697e+21+0.j]])

(In[1]: 样式提示而不是 >>> 是由于 ipython - 一种增强的 Python 交互式 shell,它是非常有用)

除此之外,使用外部 Python for 循环执行这种矩阵运算可能会慢 1000 到 10000 倍 - 因此,正确使用 Numpy 确实需要熟悉 Python,并熟悉 Numpy 的工作方式,这有利于在 native 代码中计算矩阵运算。

关于python - 在 Python 中对矩阵执行幂运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42066956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com