diff --git a/src/multrix.nim b/src/multrix.nim index c8dc908..0fce5b3 100644 --- a/src/multrix.nim +++ b/src/multrix.nim @@ -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 diff --git a/src/procedures.nim b/src/procedures.nim index 2d37a98..fc00334 100644 --- a/src/procedures.nim +++ b/src/procedures.nim @@ -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) \ No newline at end of file