added logic to handle scalar multiplication
This commit is contained in:
parent
cfd70851c6
commit
cffe9ff7ca
|
@ -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
|
||||
|
|
|
@ -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)
|
Loading…
Reference in a new issue