-
-
Notifications
You must be signed in to change notification settings - Fork 46.6k
Added rank of matrix in linear algebra #8687
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 19 commits
52ec964
df86e10
a1e7bb7
6cca1cd
cb96700
c027189
d157ec0
9451960
1d026c9
b37b262
c8af526
1b5a31a
80de4d3
9b3fa92
afb5191
301726a
e683139
cd8d209
0b13df6
8d6caaf
fc66a5b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
""" | ||
Calculate the rank of a matrix. | ||
|
||
See: https://en.wikipedia.org/wiki/Rank_(linear_algebra) | ||
""" | ||
|
||
|
||
def rank_of_matrix(matrix: list[list[int]]) -> int: | ||
cclauss marked this conversation as resolved.
Show resolved
Hide resolved
|
||
""" | ||
Finds the rank of a matrix. | ||
Args: | ||
matrix: The matrix as a list of lists. | ||
Returns: | ||
The rank of the matrix. | ||
Example: | ||
>>> matrix1 = [[1, 2, 3], | ||
... [4, 5, 6], | ||
... [7, 8, 9]] | ||
>>> rank_of_matrix(matrix1) | ||
2 | ||
>>> matrix2 = [[1, 0, 0], | ||
... [0, 1, 0], | ||
... [0, 0, 0]] | ||
>>> rank_of_matrix(matrix2) | ||
2 | ||
>>> matrix3 = [[1, 2, 3, 4], | ||
... [5, 6, 7, 8], | ||
... [9, 10, 11, 12]] | ||
>>> rank_of_matrix(matrix3) | ||
2 | ||
>>> rank_of_matrix([[2,3,-1,-1], | ||
... [1,-1,-2,4], | ||
... [3,1,3,-2], | ||
... [6,3,0,-7]]) | ||
4 | ||
>>> rank_of_matrix([[2,1,-3,-6], | ||
... [3,-3,1,2], | ||
... [1,1,1,2]]) | ||
3 | ||
>>> rank_of_matrix([[2,-1,0], | ||
... [1,3,4], | ||
... [4,1,-3]]) | ||
3 | ||
>>> rank_of_matrix([[3,2,1], | ||
... [-6,-4,-2]]) | ||
1 | ||
>>> rank_of_matrix([[],[]]) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ok sir There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for your suggestions There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I hope this is ready to merge |
||
0 | ||
>>> rank_of_matrix([[1]]) | ||
1 | ||
>>> rank_of_matrix([[]]) | ||
0 | ||
""" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. add more unique doctests. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ok There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. removed my name and added more unique doctests There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. add doctest for two empty lists There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. oook There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. is there any more corrections There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thank you for your support sir |
||
|
||
rows = len(matrix) | ||
columns = len(matrix[0]) | ||
rank = min(rows, columns) | ||
|
||
for row in range(rank): | ||
# Check if diagonal element is not zero | ||
if matrix[row][row] != 0: | ||
# Eliminate all the elements below the diagonal | ||
for col in range(row + 1, rows): | ||
multiplier = matrix[col][row] / matrix[row][row] | ||
for i in range(row, columns): | ||
matrix[col][i] -= multiplier * matrix[row][i] | ||
else: | ||
# Find a non-zero diagonal element to swap rows | ||
reduce = True | ||
for i in range(row + 1, rows): | ||
if matrix[i][row] != 0: | ||
matrix[row], matrix[i] = matrix[i], matrix[row] | ||
reduce = False | ||
break | ||
if reduce: | ||
rank -= 1 | ||
for i in range(rows): | ||
matrix[i][row] = matrix[i][rank] | ||
|
||
# Reduce the row pointer by one to stay on the same row | ||
row -= 1 | ||
|
||
return rank | ||
|
||
|
||
if __name__ == "__main__": | ||
import doctest | ||
|
||
doctest.testmod() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
no need to give name.