added logic to handle scalar multiplication

This commit is contained in:
array-in-a-matrix 2024-02-26 17:12:17 -05:00
parent cfd70851c6
commit cffe9ff7ca
2 changed files with 64 additions and 9 deletions

View file

@ -11,13 +11,17 @@ if "dot" in args or "d" in args:
dot()
elif "cross" in args or "c" in args:
cross()
elif "scalar" in args or "s" in args:
scalar()
else:
styledEcho resetStyle, "Would you like to preform the ", styleBright, "dot ", resetStyle, "or ", styleBright, "cross ", resetStyle, "product?"
styledEcho resetStyle, "Would you like to preform the ", styleBright, "dot", resetStyle, ", ", styleBright, "cross ", resetStyle, "or ", styleBright, "scalar ", resetStyle, "product?"
case toLowerAscii(readLine(stdin)):
of "dot", "d":
of "dot", "d", "1":
dot()
of "cross", "c":
of "cross", "c", "2":
cross()
of "scalar", "s", "3":
scalar()
else:
styledEcho fgRed, "Invalid operation!"
quit QuitFailure

View file

@ -31,6 +31,20 @@ proc fillMatrix*(matrix: var seq[seq[float]], row, col: int) =
matrix[i-1].delete(0)
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
proc calcDot(matrix1: seq[seq[float]], matrix2: seq[seq[float]]): seq[seq[float]] =
let col1: int = matrix1[0].len
@ -39,7 +53,26 @@ proc calcDot(matrix1: seq[seq[float]], matrix2: seq[seq[float]]): seq[seq[float]
let row2: int = matrix2.len
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
row = row1
else:
@ -70,7 +103,7 @@ proc dot* =
styledEcho "Enter number of ", styleBright, "columns ", resetStyle, "in the first matrix:"
let c1: int = getInt()
var m1 = newSeqWith(r1, newSeq[float](c1))
procedures.fillMatrix(m1, r1, c1)
fillMatrix(m1, r1, c1)
echo ""
@ -80,11 +113,10 @@ proc dot* =
styledEcho "Enter number of ", styleBright, "columns ", resetStyle, "in the second matrix:"
let c2: int = getInt()
var m2 = newSeqWith(r2, newSeq[float](c2))
procedures.fillMatrix(m2, r2, c2)
fillMatrix(m2, r2, c2)
#? resultent matrix
var m: seq[seq[float]]
m = calcDot(m1, m2)
let m: seq[seq[float]] = calcDot(m1, m2)
echo "\nFirst matrix is:"
printMatrix(m1)
@ -101,6 +133,7 @@ proc cross* =
var
v1: VECTOR
v2: VECTOR
v: VECTOR
styledEcho "Enter numbers in the ", styleBright, "first ", resetStyle, "vector:"
for i in 0..2:
@ -113,8 +146,26 @@ proc cross* =
v2[i] = getFloat()
#? resultent vector
let v = calcCross(v1, v2)
v = calcCross(v1, v2)
echo v1, " \u2A2F ", v2
echo "\nResult vector is:"
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)