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

标签 python matlab matrix

我有以下矩阵 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/

相关文章:

python - Python代码中的 `lambda`是什么?它如何与 `key` 的 `sorted` 、 `sum` 等参数一起使用?

Python Twisted 客户端连接丢失

iPhone OpenGL ES - 如何选择

c++ - OpenCV 将子矩阵复制到图像的另一个 ROI 中

algorithm - 对于大小为 k x k 的矩阵,Strassen 算法有多少浮点运算?

python - 手动创建新的 webdriver session

python - 无法使用 python-requests 发布文件+数据

MATLAB:更改加载图形的线条属性?

Matlab:计算时间序列模型的协方差矩阵的逆

python - 将 MATLAB 字符串数据写入 csv ,然后从 python 作为字符串调用 csv 数据