Compare commits
11 commits
multrix-1.
...
main
Author | SHA1 | Date | |
---|---|---|---|
1514f98c1a | |||
5c954b63b1 | |||
8ebea26bdd | |||
a51029284c | |||
cffe9ff7ca | |||
cfd70851c6 | |||
array-in-a-matrix | e9d4f763e0 | ||
array-in-a-matrix | ec084ce210 | ||
array-in-a-matrix | 1fd73f0195 | ||
7267f7159c | |||
e694bcf683 |
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -4,4 +4,6 @@ nimblecache/
|
|||
htmldocs/
|
||||
bin/
|
||||
doc/
|
||||
multrix
|
||||
multrix
|
||||
*.tar.gz
|
||||
*.pkg.tar.zst
|
22
PKGBUILD
Normal file
22
PKGBUILD
Normal file
|
@ -0,0 +1,22 @@
|
|||
# Maintainer: "Array in a Matrix" <tensor@arrayinamatrix.xyz>
|
||||
pkgname=multrix
|
||||
pkgver=1.3
|
||||
pkgrel=1
|
||||
pkgdesc="Matrix multiplication calculator."
|
||||
arch=('x86_64')
|
||||
url="https://git.inamatrix.xyz/array-in-a-matrix/multrix"
|
||||
license=('GPL3')
|
||||
makedepends=('nim' 'git')
|
||||
# source=("$url/archive/$pkgname-$pkgver.tar.gz")
|
||||
source=("$pkgname"::git+${url}.git)
|
||||
sha512sums=('SKIP')
|
||||
|
||||
build() {
|
||||
cd "$pkgname"
|
||||
nimble build
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$pkgname"
|
||||
install -Dm755 multrix $pkgdir/usr/bin/multrix
|
||||
}
|
18
README.md
18
README.md
|
@ -4,15 +4,23 @@ Matrix multiplication calculator; calculates the cross & dot products of matrice
|
|||
|
||||
## Usage
|
||||
|
||||
To calculate the dot product of 2 matrices execute the `dot` command or `multrix` command in the output `bin` directory.
|
||||
|
||||
To calculate the cross product of 2 vectors execute the `cross` command or `multrix` command in the output `bin` directory.
|
||||
|
||||
The `multrix` command can calculate both dot or cross products if given the respective command line argument. If no valid commandline argument is given the program will ask which type of calculation should be made.
|
||||
|
||||
## installation
|
||||
|
||||
The program requires no dependencies other than the nim standard library. Just run `make` in the root of the project and run the executables in `bin`.
|
||||
To install using nimble:
|
||||
|
||||
```sh
|
||||
nimble install https://git.inamatrix.xyz/array-in-a-matrix/multrix
|
||||
```
|
||||
|
||||
To install using pacman:
|
||||
|
||||
```sh
|
||||
git clone https://git.inamatrix.xyz/array-in-a-matrix/multrix
|
||||
cd multrix
|
||||
makepkg si
|
||||
```
|
||||
|
||||
## Math
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
version = "1.1"
|
||||
version = "1.3"
|
||||
author = "Array in a Matrix"
|
||||
description = "Matrix multiplication calculator."
|
||||
license = "AGPL-3.0-or-later"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import strutils, os, procedures
|
||||
import strutils, os, procedures, terminal
|
||||
|
||||
var argument: string
|
||||
|
||||
|
@ -11,12 +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:
|
||||
echo "Would you like to preform the dot or cross 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:
|
||||
quit "Invalid operation!", QuitFailure
|
||||
styledEcho fgRed, "Invalid operation!"
|
||||
quit QuitFailure
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import strutils, sequtils
|
||||
import strutils, sequtils, terminal, re
|
||||
|
||||
#? validate if user input is of correct type
|
||||
proc getInt: int =
|
||||
|
@ -6,15 +6,23 @@ 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 =
|
||||
while(true):
|
||||
try:
|
||||
return parseFloat(readline(stdin))
|
||||
let number: string = readline(stdin).replace(" ","").replace("\t", "")
|
||||
|
||||
#? if the number given is a fraction convert it into decimal
|
||||
if match(number, re"[0-9]+/[0-9]+"):
|
||||
let
|
||||
numerator: float = number.split('/')[0].parseFloat
|
||||
denominator: float = number.split('/')[1].parseFloat
|
||||
return numerator / denominator
|
||||
return parseFloat(number)
|
||||
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 +39,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 +61,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 +103,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 +134,48 @@ 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 "\nInitial matrix is:"
|
||||
printMatrix(m)
|
||||
echo "\nScaled matrix is:"
|
||||
printMatrix(M)
|
Loading…
Reference in a new issue