multrix/src/procedures.nim
2023-01-16 16:28:14 -05:00

106 lines
3.1 KiB
Nim
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import strutils, sequtils
#? prints a matrix to the standard output
proc printMatrix*(matrix: seq[seq[float]]) =
let row: int = matrix.len
for i in countup(1, row):
echo matrix[i-1]
#? get elements of matrix from standard input
proc fillMatrix*(matrix: var seq[seq[float]], row, col: int) =
for i in countup(1, row):
for j in countup(1, col):
echo "Enter item:"
var entry: float = parseFloat(readLine(stdin)) # TODO: while loop to check if input is valid
matrix[i-1].add(entry)
matrix[i-1].delete(0)
echo matrix[i-1]
#? calculate dot product
proc calcDot(matrix1: seq[seq[float]], matrix2: seq[seq[float]]): seq[seq[float]] =
let col1: int = matrix1[0].len
let row1: int = matrix1.len
let col2: int = matrix2[0].len
let row2: int = matrix2.len
var col, row: int
if col1 == row2:
col = col2
row = row1
else:
quit "Matrix dimensions mismatched, operation invalid!", QuitFailure
var matrix = newSeqWith(row, newSeq[float](col))
for i in countup(0, row1-1):
for j in countup(0, col2-1):
for k in countup(0, col1-1):
matrix[i][j] = matrix[i][j] + matrix1[i][k] * matrix2[k][j]
return matrix
#? calculate cross product
proc calcCross(vector1: array[3, float], vector2: array[3, float]): array[3, float] =
let i: float = vector1[1]*vector2[2] - vector1[2]*vector2[1]
let j: float = vector1[2]*vector2[0] - vector1[0]*vector2[2]
let k: float = vector1[0]*vector2[1] - vector1[1]*vector2[0]
let vector = [i, j, k]
return vector
proc dot*() =
echo "MATRIX DOT PRODUCT"
#? record first matrix
echo "Enter number of rows in the first matrix:"
let r1: int = parseInt(readLine(stdin))
echo "Enter number of columns in the first matrix:"
let c1: int = parseInt(readLine(stdin))
var m1 = newSeqWith(r1, newSeq[float](c1))
procedures.fillMatrix(m1, r1, c1)
echo ""
#? record second matrix
echo "Enter number of rows in the second matrix:"
let r2: int = parseInt(readLine(stdin))
echo "Enter number of columns in the second matrix:"
let c2: int = parseInt(readLine(stdin))
var m2 = newSeqWith(r2, newSeq[float](c2))
procedures.fillMatrix(m2, r2, c2)
#? resultent matrix
var m = newSeqWith(0, newSeq[float](0))
m = calcDot(m1, m2) #? calculate dot product (in procedures)
echo "\nFirst matrix is:"
printMatrix(m1)
echo "\nSecond matrix is:"
printMatrix(m2)
echo "\nResult matrix is:"
printMatrix(m)
proc cross*() =
echo "VECTOR CROSS PRODUCT"
type
vector = array[3, float]
var
v1: vector
v2: vector
echo "Enter numbers in the first vector:"
for i in countup(0, 2):
echo "Enter item:"
v1[i] = parseFloat(readLine(stdin))
echo "Enter numbers in the second vector:"
for i in countup(0, 2):
echo "Enter item:"
v2[i] = parseFloat(readLine(stdin))
#? resultent vector
let v = calcCross(v1, v2)
echo v1, " × ", v2
echo "\nResult vector is:"
echo v