python - 制作一个类进程 A 2 by 2 矩阵并有问题通过 __str__ 返回它

标签 python python-3.x math matrix

所以我必须通过一个类处理 2 x 2 矩阵,并使用 str 返回打印输出。我无法真正创建新函数,而且我很确定矩阵的数学很好,我只是遇到了一些输出问题。我标记了该区域,特别是我无法修改的输出,但我可以修改类来支持它。

这是我的代码。

# This code aims to take a 2 by 2 matrix and add, subtract, and multiply it by another matrix, as well as inverse and power it.
# ----------------------------------------------------------------------------------------------------------------------
# This is how we'll use math.nan and only math.nan
import math

# Your classes should go here
class Matrix2x2:  # Just initializing as needed.
    def __init__(self,a,b,c,d):
        self.a = a
        self.b = b
        self.c = c
        self.d = d

    def __add__(self,second):
        return(Matrix2x2(self.a+second.a,self.b+second.b,self.c+second.c,self.d+second.d))

    def __sub__(self, second):  # Just subtracting instead of adding
        return(Matrix2x2(self.a - second.a,self.b-second.b,self.c-second.c,self.d-second.d))

    def __mul__(self, second):  # Multiplying them based on the according spot and some addition.
        return(Matrix2x2(self.a*second.a+self.b*second.c,self.a*second.b+self.b*second.d,self.c*second.a+self.d*second.c,self.c*second.b+self.d*second.d))

    def __pow__(self, power):  # Process varies based on what we work with.
        StoredMatrix = Matrix2x2(self.a, self.b, self.c, self.d)  # The variables just save information and make the math more clean.
        determinant = 1/((self.a*self.d)-(self.b*self.c))  # Used to simplify inversing and determine if there is an inverse.
        InverseMatrix = Matrix2x2(self.d*determinant,-self.b*determinant,-self.c*determinant, self.a*determinant)
        if power > 0:
            count = 1
            while count < power:  # The original matrix is repeatedly multiplied and stored until it matches the power value.
                count+=1
                StoredMatrix *= Matrix2x2(self.a, self.b, self.c, self.d)
            return StoredMatrix
        elif power < 0:
            count = 0
            while count < power:
                count+=1
                InverseMatrix *= Matrix2x2(self.d*determinant,-self.b*determinant,-self.c*determinant,self.a*determinant)
            return InverseMatrix
        if determinant == 0 or power == 0:  # This means that there is no inverse, or the power value is 0 and invalid.
            return(Matrix2x2(math.nan, math.nan, math.nan, math.nan))

    def __str__(self):
        return print('[',str(self.a) ,str(self.b) ,']\n' ,'\b[' ,str(self.c) ,str(self.d),']')

#  Do NOT use any pre-built packages to perform the below operations, each should
#   be coded using regular mathematics operation (+,-,*,/), no numpy or math functions other
#   than math.nan

# Code below cannot be modified
A = Matrix2x2(1,2,3,4)
B = Matrix2x2(4,3,2,1)

print('Addition: A+B')
print(A,"+\n",B,"=\n",A+B,sep="")
input(),print('Subtraction: A-B')
print(A,"-\n",B,"=\n",A-B,sep="")
input(),print('Multiplication: A*B')
print(A,"*\n",B,"=\n",A*B,sep="")
input(),print('Multiplication: B*A')
print(B,"*\n",A,"=\n",B*A,sep="")
input(),print('Powers: A^3 ')
print(A,"^3","\n=\n",A**3,sep="")
input(),print('Inverse: A^-1 ')
print(A,"^-1","\n=\n",A**(-1),sep="")
input(),print('Inverse with powers: A^-3  = (A^-1)^3')
print(A,"^-3","\n=\n",A**(-3),sep="")
# code above cannot be modified

# Just for testing, below.
print(A.__add__(B))
print(A.__sub__(B))
print(A.__mul__(B))
print(A.__pow__(3))
print(A.__pow__(-1))
print(A.__pow__(0))
print(A.__pow(-3))

由于使用 add 函数使用 NoneType,我通常会收到错误。这不允许我看到我会遇到什么错误。我尝试使用 str() 将它们单独转换为字符串并得到相同的错误。我也不认为这是 math.nan 的。 这是一个例子:

Addition: A+B
[ 1 2 ]
[ 3 4 ]
Traceback (most recent call last):
  File "ThisWasPurposelyCensored", line 51, in <module>
    print(A,"+\n",B,"=\n",A+B,sep="")
TypeError: __str__ returned non-string (type NoneType)

Process finished with exit code 1

无论如何,如何避免 NoneType 问题或使其与 str 兼容,而不过多干扰数学和所需的输入?我将提供您可能需要的更多信息来帮助我解决此问题。

最佳答案

将您的 __str__ 方法重写为这样

def __str__(self):
    return '[ {} {} ]\n[ {} {} ]'.format(self.a, self.b, self.c, self.d)

短一点

def __str__(self):
    return '[ {x.a} {x.b} ]\n[ {x.c} {x.d} ]'.format(x=self)

关于python - 制作一个类进程 A 2 by 2 矩阵并有问题通过 __str__ 返回它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59340034/

相关文章:

python - 是什么让神经网络学习 x/256 的类别是 x 的分类器如此困难?

python - 输出是数字列表而不是一个数字

python - Mandelbrot 序列与 Python 的 Turtle

python - 字符串中最常见的字符

java - 对于序列中的每个成员,确定它是否是完全平方数

python - 将 sqlite3.cursor 转换为 int PYTHON

python-3.x - 逐行堆叠 numpy 数组

python - Keras 不适用于 python3

Java math.random查询,四舍五入(概念理解)

Java -100 到 100 之间的随机数