未验证 提交 a64c9f1e 编写于 作者: T Tianyi Zheng 提交者: GitHub

Deduplicate euclidean_length method in Vector (#5658)

* Rewrite parts of Vector and Matrix methods

* Refactor determinant method and add unit tests

Refactor determinant method to create separate minor and cofactor
methods.
Add respective unit tests for new methods.
Rename methods using snake case to follow Python naming conventions.

* Reorganize Vector and Matrix methods

* Update linear_algebra/README.md
Co-authored-by: NJohn Law <johnlaw.po@gmail.com>

* Fix punctuation and wording

* Apply suggestions from code review
Co-authored-by: NJohn Law <johnlaw.po@gmail.com>

* Deduplicate euclidean length method for Vector

* Add more unit tests for Euclidean length method

* Fix bug in unit test for euclidean_length

* Remove old comments for magnitude method
Co-authored-by: NJohn Law <johnlaw.po@gmail.com>
上级 508589e3
......@@ -44,7 +44,6 @@ class Vector:
component(i): gets the i-th component (0-indexed)
change_component(pos: int, value: float): changes specified component
euclidean_length(): returns the euclidean length of the vector
magnitude(): returns the magnitude of the vector
angle(other: Vector, deg: bool): returns the angle between two vectors
TODO: compare-operator
"""
......@@ -159,18 +158,20 @@ class Vector:
def euclidean_length(self) -> float:
"""
returns the euclidean length of the vector
"""
squares = [c ** 2 for c in self.__components]
return math.sqrt(sum(squares))
def magnitude(self) -> float:
"""
Magnitude of a Vector
>>> Vector([2, 3, 4]).magnitude()
>>> Vector([2, 3, 4]).euclidean_length()
5.385164807134504
>>> Vector([1]).euclidean_length()
1.0
>>> Vector([0, -1, -2, -3, 4, 5, 6]).euclidean_length()
9.539392014169456
>>> Vector([]).euclidean_length()
Traceback (most recent call last):
...
Exception: Vector is empty
"""
if len(self.__components) == 0:
raise Exception("Vector is empty")
squares = [c ** 2 for c in self.__components]
return math.sqrt(sum(squares))
......@@ -188,7 +189,7 @@ class Vector:
Exception: invalid operand!
"""
num = self * other
den = self.magnitude() * other.magnitude()
den = self.euclidean_length() * other.euclidean_length()
if deg:
return math.degrees(math.acos(num / den))
else:
......@@ -267,8 +268,7 @@ class Matrix:
def __init__(self, matrix: list[list[float]], w: int, h: int) -> None:
"""
simple constructor for initializing
the matrix with components.
simple constructor for initializing the matrix with components.
"""
self.__matrix = matrix
self.__width = w
......@@ -276,8 +276,7 @@ class Matrix:
def __str__(self) -> str:
"""
returns a string representation of this
matrix.
returns a string representation of this matrix.
"""
ans = ""
for i in range(self.__height):
......@@ -291,7 +290,7 @@ class Matrix:
def __add__(self, other: Matrix) -> Matrix:
"""
implements the matrix-addition.
implements matrix addition.
"""
if self.__width == other.width() and self.__height == other.height():
matrix = []
......@@ -307,7 +306,7 @@ class Matrix:
def __sub__(self, other: Matrix) -> Matrix:
"""
implements the matrix-subtraction.
implements matrix subtraction.
"""
if self.__width == other.width() and self.__height == other.height():
matrix = []
......
......@@ -42,12 +42,18 @@ class Test(unittest.TestCase):
x = Vector([1, 2, 3, 4])
self.assertEqual(len(x), 4)
def test_euclidLength(self) -> None:
def test_euclidean_length(self) -> None:
"""
test for method euclidean_length()
"""
x = Vector([1, 2])
y = Vector([1, 2, 3, 4, 5])
z = Vector([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
w = Vector([1, -1, 1, -1, 2, -3, 4, -5])
self.assertAlmostEqual(x.euclidean_length(), 2.236, 3)
self.assertAlmostEqual(y.euclidean_length(), 7.416, 3)
self.assertEqual(z.euclidean_length(), 0)
self.assertAlmostEqual(w.euclidean_length(), 7.616, 3)
def test_add(self) -> None:
"""
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册