Skip to content

Commit

Permalink
Deduplicate euclidean_length method in Vector (TheAlgorithms#5658)
Browse files Browse the repository at this point in the history
* 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: John Law <johnlaw.po@gmail.com>

* Fix punctuation and wording

* Apply suggestions from code review

Co-authored-by: John 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: John Law <johnlaw.po@gmail.com>
  • Loading branch information
tianyizheng02 and poyea committed Oct 31, 2021
1 parent 508589e commit a64c9f1
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 18 deletions.
33 changes: 16 additions & 17 deletions linear_algebra/src/lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
"""
Expand Down Expand Up @@ -159,18 +158,20 @@ def change_component(self, pos: int, value: float) -> None:
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))

Expand All @@ -188,7 +189,7 @@ def angle(self, other: Vector, deg: bool = False) -> float:
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:
Expand Down Expand Up @@ -267,17 +268,15 @@ 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
self.__height = h

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):
Expand All @@ -291,7 +290,7 @@ def __str__(self) -> str:

def __add__(self, other: Matrix) -> Matrix:
"""
implements the matrix-addition.
implements matrix addition.
"""
if self.__width == other.width() and self.__height == other.height():
matrix = []
Expand All @@ -307,7 +306,7 @@ def __add__(self, other: Matrix) -> 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 = []
Expand Down
8 changes: 7 additions & 1 deletion linear_algebra/src/test_linear_algebra.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,18 @@ def test_size(self) -> None:
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:
"""
Expand Down

0 comments on commit a64c9f1

Please sign in to comment.