|
|
|
@ -1,4 +1,4 @@
|
|
|
|
|
import strutils, sequtils
|
|
|
|
|
import strutils, sequtils, terminal
|
|
|
|
|
|
|
|
|
|
#? validate if user input is of correct type
|
|
|
|
|
proc getInt: int =
|
|
|
|
@ -6,7 +6,7 @@ proc getInt: int =
|
|
|
|
|
try:
|
|
|
|
|
return parseInt(readline(stdin))
|
|
|
|
|
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
|
|
|
|
|
proc getFloat: float =
|
|
|
|
@ -14,7 +14,7 @@ proc getFloat: float =
|
|
|
|
|
try:
|
|
|
|
|
return parseFloat(readline(stdin))
|
|
|
|
|
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
|
|
|
|
|
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)
|
|
|
|
|
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,11 +53,31 @@ 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:
|
|
|
|
|
quit "Matrix dimensions mismatched, operation invalid!", QuitFailure
|
|
|
|
|
styledEcho fgRed, "Matrix dimensions mismatched!"
|
|
|
|
|
quit QuitFailure
|
|
|
|
|
|
|
|
|
|
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]
|
|
|
|
|
|
|
|
|
|
proc dot* =
|
|
|
|
|
echo "MATRIX DOT PRODUCT"
|
|
|
|
|
styledEcho styleBright, "Matrix Dot Product"
|
|
|
|
|
|
|
|
|
|
#? 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()
|
|
|
|
|
echo "Enter number of columns in the first matrix:"
|
|
|
|
|
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 ""
|
|
|
|
|
|
|
|
|
|
#? 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()
|
|
|
|
|
echo "Enter number of columns in the second matrix:"
|
|
|
|
|
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)
|
|
|
|
@ -93,27 +126,46 @@ proc dot* =
|
|
|
|
|
printMatrix(m)
|
|
|
|
|
|
|
|
|
|
proc cross* =
|
|
|
|
|
echo "VECTOR CROSS PRODUCT"
|
|
|
|
|
styledEcho styleBright, "Vector Cross Product"
|
|
|
|
|
|
|
|
|
|
type
|
|
|
|
|
VECTOR = array[3, float]
|
|
|
|
|
var
|
|
|
|
|
v1: 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:
|
|
|
|
|
echo "Enter item:"
|
|
|
|
|
v1[i] = getFloat()
|
|
|
|
|
|
|
|
|
|
echo "Enter numbers in the second vector:"
|
|
|
|
|
styledEcho "Enter numbers in the ", styleBright, "second ", resetStyle, "vector:"
|
|
|
|
|
for i in 0..2:
|
|
|
|
|
echo "Enter item:"
|
|
|
|
|
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)
|