Compare commits

...

3 commits

Author SHA1 Message Date
array-in-a-matrix a51029284c Merge branch 'main' of https://git.arrayinamatrix.xyz/array-in-a-matrix/multrix 2024-02-26 17:12:39 -05:00
array-in-a-matrix cffe9ff7ca added logic to handle scalar multiplication 2024-02-26 17:12:17 -05:00
array-in-a-matrix cfd70851c6 styled text outputed 2024-02-26 15:53:28 -05:00
2 changed files with 80 additions and 23 deletions

View file

@ -1,4 +1,4 @@
import strutils, os, procedures import strutils, os, procedures, terminal
var argument: string var argument: string
@ -11,12 +11,17 @@ if "dot" in args or "d" in args:
dot() dot()
elif "cross" in args or "c" in args: elif "cross" in args or "c" in args:
cross() cross()
elif "scalar" in args or "s" in args:
scalar()
else: else:
echo "Would you like to preform the dot or cross product?" styledEcho resetStyle, "Would you like to preform the ", styleBright, "dot", resetStyle, ", ", styleBright, "cross ", resetStyle, "or ", styleBright, "scalar ", resetStyle, "product?"
case toLowerAscii(readLine(stdin)): case toLowerAscii(readLine(stdin)):
of "dot", "d": of "dot", "d", "1":
dot() dot()
of "cross", "c": of "cross", "c", "2":
cross() cross()
of "scalar", "s", "3":
scalar()
else: else:
quit "Invalid operation!", QuitFailure styledEcho fgRed, "Invalid operation!"
quit QuitFailure

View file

@ -1,4 +1,4 @@
import strutils, sequtils import strutils, sequtils, terminal
#? validate if user input is of correct type #? validate if user input is of correct type
proc getInt: int = proc getInt: int =
@ -6,7 +6,7 @@ proc getInt: int =
try: try:
return parseInt(readline(stdin)) return parseInt(readline(stdin))
except: except:
echo "Please enter an integer, try again." styledEcho resetStyle, "Please enter an ", styleBright, "integer, " , resetStyle, "try again."
#? validate if user input is of correct type #? validate if user input is of correct type
proc getFloat: float = proc getFloat: float =
@ -14,7 +14,7 @@ proc getFloat: float =
try: try:
return parseFloat(readline(stdin)) return parseFloat(readline(stdin))
except: except:
echo "Please enter a number, try again." styledEcho resetStyle, "Please enter a ", styleBright, "number, " , resetStyle, "try again."
#? prints a matrix to the standard output #? prints a matrix to the standard output
proc printMatrix*(matrix: seq[seq[float]]) = proc printMatrix*(matrix: seq[seq[float]]) =
@ -31,6 +31,20 @@ proc fillMatrix*(matrix: var seq[seq[float]], row, col: int) =
matrix[i-1].delete(0) matrix[i-1].delete(0)
echo matrix[i-1] echo matrix[i-1]
#? calculate scalar product
proc calcScalar(factor: float, matrix: seq[seq[float]]): seq[seq[float]] =
let col: int = matrix[0].len
let row: int = matrix.len
var newMatrix = newSeqWith(row, newSeq[float](col))
if col == row and col == 1:
styledEcho fgRed, "\nPure scalar multiplication detected!"
return @[@[ factor * matrix[0][0]]]
for i in countup(0, row-1):
for j in countup(0, col-1):
newMatrix[i][j] = factor * matrix[i][j]
return newMatrix
#? calculate dot product #? calculate dot product
proc calcDot(matrix1: seq[seq[float]], matrix2: seq[seq[float]]): seq[seq[float]] = proc calcDot(matrix1: seq[seq[float]], matrix2: seq[seq[float]]): seq[seq[float]] =
let col1: int = matrix1[0].len let col1: int = matrix1[0].len
@ -39,11 +53,31 @@ proc calcDot(matrix1: seq[seq[float]], matrix2: seq[seq[float]]): seq[seq[float]
let row2: int = matrix2.len let row2: int = matrix2.len
var col, row: int var col, row: int
if col1 == row2: #? check if both matrics are actually scalars
if (col1 == row1 and col1 == 1) and (col2 == row2 and col2 == 1):
styledEcho fgRed, "\nPure scalar multiplication detected!"
return @[@[matrix1[0][0] * matrix2[0][0]]]
#? check if the first matrix is actually a scalar
elif col1 == row1 and col1 == 1:
styledEcho fgRed, "\nMatrix scalar multiplication detected!"
var matrix = newSeqWith(row2, newSeq[float](col2))
matrix = calcScalar(matrix1[0][0], matrix2)
return matrix
#? check if the second matrix is actually a scalar
elif col2 == row2 and col2 == 1:
styledEcho fgRed, "\nMatrix scalar multiplication detected!"
var matrix = newSeqWith(row1, newSeq[float](col1))
matrix = calcScalar(matrix2[0][0], matrix1)
return matrix
elif col1 == row2:
col = col2 col = col2
row = row1 row = row1
else: else:
quit "Matrix dimensions mismatched, operation invalid!", QuitFailure styledEcho fgRed, "Matrix dimensions mismatched!"
quit QuitFailure
var matrix = newSeqWith(row, newSeq[float](col)) var matrix = newSeqWith(row, newSeq[float](col))
@ -61,29 +95,28 @@ proc calcCross(vector1: array[3, float], vector2: array[3, float]): array[3, flo
result = [i, j, k] result = [i, j, k]
proc dot* = proc dot* =
echo "MATRIX DOT PRODUCT" styledEcho styleBright, "Matrix Dot Product"
#? record first matrix #? record first matrix
echo "Enter number of rows in the first matrix:" styledEcho "Enter number of ", styleBright, "rows ", resetStyle, "in the first matrix:"
let r1: int = getInt() let r1: int = getInt()
echo "Enter number of columns in the first matrix:" styledEcho "Enter number of ", styleBright, "columns ", resetStyle, "in the first matrix:"
let c1: int = getInt() let c1: int = getInt()
var m1 = newSeqWith(r1, newSeq[float](c1)) var m1 = newSeqWith(r1, newSeq[float](c1))
procedures.fillMatrix(m1, r1, c1) fillMatrix(m1, r1, c1)
echo "" echo ""
#? record second matrix #? record second matrix
echo "Enter number of rows in the second matrix:" styledEcho "Enter number of ", styleBright, "rows ", resetStyle, "in the second matrix:"
let r2: int = getInt() let r2: int = getInt()
echo "Enter number of columns in the second matrix:" styledEcho "Enter number of ", styleBright, "columns ", resetStyle, "in the second matrix:"
let c2: int = getInt() let c2: int = getInt()
var m2 = newSeqWith(r2, newSeq[float](c2)) var m2 = newSeqWith(r2, newSeq[float](c2))
procedures.fillMatrix(m2, r2, c2) fillMatrix(m2, r2, c2)
#? resultent matrix #? resultent matrix
var m: seq[seq[float]] let m: seq[seq[float]] = calcDot(m1, m2)
m = calcDot(m1, m2)
echo "\nFirst matrix is:" echo "\nFirst matrix is:"
printMatrix(m1) printMatrix(m1)
@ -93,27 +126,46 @@ proc dot* =
printMatrix(m) printMatrix(m)
proc cross* = proc cross* =
echo "VECTOR CROSS PRODUCT" styledEcho styleBright, "Vector Cross Product"
type type
VECTOR = array[3, float] VECTOR = array[3, float]
var var
v1: VECTOR v1: VECTOR
v2: VECTOR v2: VECTOR
v: VECTOR
echo "Enter numbers in the first vector:" styledEcho "Enter numbers in the ", styleBright, "first ", resetStyle, "vector:"
for i in 0..2: for i in 0..2:
echo "Enter item:" echo "Enter item:"
v1[i] = getFloat() v1[i] = getFloat()
echo "Enter numbers in the second vector:" styledEcho "Enter numbers in the ", styleBright, "second ", resetStyle, "vector:"
for i in 0..2: for i in 0..2:
echo "Enter item:" echo "Enter item:"
v2[i] = getFloat() v2[i] = getFloat()
#? resultent vector #? resultent vector
let v = calcCross(v1, v2) v = calcCross(v1, v2)
echo v1, " \u2A2F ", v2 echo v1, " \u2A2F ", v2
echo "\nResult vector is:" echo "\nResult vector is:"
echo v echo v
proc scalar* =
styledEcho styleBright, "Matrix Scalar Multiplication"
styledEcho "Enter the " ,styleBright, "scale factor", resetStyle, ":"
let f: float = getFloat()
styledEcho "Enter number of ", styleBright, "rows ", resetStyle, "in the matrix:"
let r: int = getInt()
styledEcho "Enter number of ", styleBright, "columns ", resetStyle, "in the matrix:"
let c: int = getInt()
var m = newSeqWith(r, newSeq[float](c))
fillMatrix(m, r, c)
let M = calcScalar(f, m)
echo "\nResult matrix is:"
printMatrix(M)