matlabjs
v0.2.0
Published
A javascript minilibrary for basic matlab functions
Downloads
16
Maintainers
Readme
MatlabJS
A lightweight JavaScript library for MATLAB/Octave users
This library gives you some essential array and matrix functions written in JavaScript for easing your scientific computing projects or code conversion from Matlab or Octave.
Documentation
To see how it works, go to https://VivekTRamamoorthy.github.io/MatlabJS. The library is loaded on the webpage and you may start testing it in the console. The website also contains a cheatsheet.
Examples
tic()
a=linspace(0,1,100)
disp(a) ;
b=eye(4);
c=rand(4);
d=mul(b,c) ;
disp(d)
toc();
Using in your projects
Method 1: CDN (Loads the latest update)
- Include the following script tag to your html. This will include all updates and bug fixes.
<script src="https://cdn.jsdelivr.net/gh/VivekTRamamoorthy/MatlabJS/Matlab.js"></script>
This would only give the standard functions.
To use plotting tools and linsolve function, additionally includeplotlib.js
andndarray.js
files.
Method 2: Including file using script tag
- Download the
Matlab.js
file to your project folder. - Include the file in a script tag:
<script src="Matlab.js"></script>
Node:
Install using
npm install matlabjs
Use in your projects like below
const MatlabJS = require("matlabjs")
let A = MatlabJS.zeros(10,10) // [[0,0,0,...], [0,0,0,...], [0,0,0,...], .... ]
or
const {add, linspace} = require("matlabjs")
let A = add(linspace(0,1),200) // [ 200, 201.010101... , 202.020202... , ...]
A note of caution
- Operator overloading is not yet permitted in JavaScript and doesn't seem like it will be anytime soon. So it is not possible to write
c=A*b
for matrices in Javascript. Instead, one has to resort to the syntactically inconvenient universal functions, for example,c=mul(A,b)
. - When using the script tag method, all functions are loaded into the global scope using
var
s and users may overwrite them if needed like in Matlab. If you prefer a namespace import, use it as a module. - The code may not be optimised for efficiency. For intensive computations, users can manually optimise the code for their use case if performance is an issue.
- This project is in its initial stage. Additional functionalities may be included as time progresses.
Contributing
You can contribute to this repository by following these steps:
- Fork the repository and clone it locally, and create a new branch.
- Include your contribution in the
Matlab.js
file. For example:
var add2 = function(a){
return a+2;
}
- Write testing scripts for the new function in
tests/run_tests.js
file by includingtest("your_function_name(args)","expectedoutput")
.- An example would be
test("add2(4)",6)
- An example would be
- Test on the browser
- Serve and open
index.html
and click theRun tests
button on the web page displayed. This will callrun_tests.js
and print results in a popup.
- Serve and open
- Test on Node
- To initiate the testing suite, execute
npm test
from the terminal.
- To initiate the testing suite, execute
- If these tests pass, you may commit and raise a pull request to the
main
branch.
List of functions
Use left or right arrow keys to scroll if the the table is not fully visible.
Matlab function | MatlabJS equivalent | Example usage | Description
:---------------|:--------------------|:---------------|:---------------
tic
| tic()
| | Starts recording time
toc
| toc()
| tic();
t=toc();
| Prints elapsed time since start
clc
|clc()
|clc()
| Clears consolelinspace
| linspace
| A=linspace(0,1)
// [0 .1010.. 1]
B=linspace(10,20,3)
// [10,15,20]
| Produces linearly spaced array.logspace
|logspace
|A=logspace(1,1000,4)
// [1 10 100 1000]
B=logspace(1,25,3)
// [1,5,25]
| Produces logarithmically spaced arrays.disp
,display
|disp
,display
|A=linspace(0,1)
B=linspace(10,20,3)
disp(A)
display(B)
| Displays matrices and arrays in consoleisfield
|isfield(struc,fieldname)
| struc={x:10,y:100}
isfield(struc,'x')
// true
isfield(struc,'a')
// false
| Checks the presence of fieldnames in a structuresize
|size(A)
| A=[[1,2,3],[3,4,5]]
size(A) // [2,3]
| Dimensions of a matrix or arraylength
| A.length
length(A)
| A=[1,2,3,3,4,5]
A.length // 6
length(A) // 6
| Length of an arrayfind
|find
| A=[1,2,0,0,4,5]
find(A) // [1, 2, 5, 6]
| Find nonzero elementssort
| sort()
| A=[3,2,1,5,7];
[sortedA,indices]=sort(A);
disp(sortedA);
// [1,2,3,5,7]
disp(indices);
// [3,2,1,4,5]
| Sorts numbers ascendingsum
| sum
| A=[1,2,3]
sum(A) // 6
B=[[1,2,3],[4,5,6],[7,8,9]]
disp(sum(B,1))
// column sum [12,15,18]
disp(sum(B,2))
// row sum [[6],[15],[24]]
| Sum of an array Column sum of a matrix Row sum of a matrixabs
| abs
| A=[1,-2,3]
abs(A) // [1,2,3]
B=[[1,-2,3],[-4,5,6],[-7,8,-9]]
disp(abs(B))
//[1,2,3],[4,5,6],[7,8,9]
| Absolute value of num, array or matrixsqrt
| sqrt
| A=[1,4,2]
disp(sqrt(A))
// [1,2,1.414] A=rand(4)
disp(A)
disp(sqrt(A))
| Square root of a number, array or matrixsetdiff
| setdiff
| A=[4,3,1,5]
B=[5,3,7,8]
setdiff(A,B) // [1,4]
| Set difference (sorted)min
| min
| A=[1,3,-5,9]
disp(min(A)) // -5
B=[[1,2,3],[4,5,6],[7,8,9]]
disp(B)
disp(min(B,1)) // elemwise min
disp(min(B,4)) //
disp(min(B,[],1)) // column min
disp(min(B,[],2)) // row min
| Minimum of an array or matrixmax
| max
| Similar to min
| Maximum of an array or matrixa:b:c
| range(a,b,c)
| range(2,0.5,4)
// [2,2.5,3,3.5,4]
| Array from a to c in steps of btriu
| triu(Matrix,k)
| disp(triu(rand(4)))
disp(triu(rand(4),1))
| Upper trianular matrix[A, B]
| concatRows(A,B)
| A=ones(3,3)
disp(A)
B=rand(3,3)
disp(B)
C=concatRows(A,B)
disp(C)
// 3 x 6 matrix
| Concatenate rows of two matrices[A; B]
| concatCols(A,B)
| A=ones(3,3)
disp(A)
B=rand(3,3)
disp(B)
C=concatCols(A,B)
disp(C)
// 6 x 3 matrix
| Concatenate columns of two matricesA'
| transpose(A)
| A=[[1,2,3],[4,5,6]]
transpose(A)
// [[1,4],[2,5],[3,6]]
| Transposes a matrixones
| ones
| disp(ones(3))
// 3x3 matrix of 1s
disp(ones(3,2))
// 3x2 matrix of 1s
disp(ones(3,1))
// column of 1s
| Matrix of oneseye
| eye
| disp(eye(3))
// 3x3 identity matrix
disp(eye(4))
// 4x4 matrix of 1s
disp(eye(10))
// column of 1s
| Generates identity matriceszeros
| zeros
| disp(zeros(3))
// 3x3 matrix of 0s
disp(zeros(3,2))
// 3x2 matrix of 0s
disp(zeros(3,1))
// column of 0s
| Generates zero matricesrand
|rand
|disp(rand())
// random no in [0,1]
disp(rand(3))
// 3x3 random
disp(rand(3,2))
// 3x2 random
disp(rand(3,1))
// column of random
| Generates matrix with values uniformly random in [0,1]randi
| randi(N,rows,cols)
| disp(randi(5))
// random num in {1,2...5}
disp(randi(5,3))
disp(randi(5,3,2))
// 3x2 random in {1,2...5}
| Generate random integer matrices with values in[0,1,2,...,N]
diag
| diag(D)
| disp(diag([5,3,2]))
// returns:
// [ [5, 0, 0],
// [0, 3, 0],
// [0, 0, 2] ]
| Diagonal matrix from an arrayreshape
| reshape
| reshape([1,2,3,4,5,6],2,3)
// [1,2,3; 4,5,6]
| Reshape a vector or a matrix
Getting values A(rowrange,colrange)
A(1:3,1:3)
A(10,10)
A(end,end-1)
| get(A,rowrange,colrange)
get(A,[1,2,3],[1,2,3])
get(A,10,10)
get(A,0,-1)
| A=rand(10,10);disp(A)
B=get(A,[1,2,3],[2,5,7])
disp(B)
B=get(A,':',[1,2,3])
disp(B)
// gets all rows & first 3 cols
| Get values of a submatrix
Setting values in matrices A(rowrange,colrange)=B
A(1:3,1:3)=B
A(end-5:end,:)=2
a(arrayrange)=b
a(1:3)=[10 20 30]
a(1)=10
a(end-2)=8
| set(A,rowrange,colrange,B)
set(A,[1,2,3],[1,2,3],B)
set(A,range(-5,0),':',2)
set(a,arrayrange,b)
set(a,[1,2,3],[10,20,30])
set(a,1,10)
set(a,-2,8)
| Matrix example:
A=rand(5,5)
set(A,range(1,3),range(1,3),0)
disp(A)
// sets first 3 rows and cols to 0
set(
A,
range(1,3),
range(1,3),
randi(2,3,3)
)
disp(A)
// sets first 3 rows and cols
// to random in {1,2}
Array example: A=[1,2,3,4,5,6]
set(A,2,10)// A(2)=10
set(A,0,100) // A(end)=20
set(A,-1,20) // A(end-1)=20
disp(A) // [1, 10, 3, 4, 20, 100]
| Set values to a submatrix
repmat
| repmat(mat,rows,cols)
| A=rand(2,3)
B=repmat(A,4,5)
disp(B)
| Repeat matrixkron
| kron(X,Y)
| A=[[1,2,3],[2,3,4]];
Y=[[1],[1],[1]];
display(kron(A,Y))
| Kronecker tensor productunion
| union(X,Y)
| A=[1,2,3,4];
B=[5,3,10];
display(union(A,B))
//[1,2,3,4,5,10]
| Union of two setsunique
| unique(A)
| A=[10,2,3,3,4];
display(unique(A))
//[2,3,4,10]
| Unique items of a setsparse(I,J,K)
| sparse(I,J,K,nRows,nCols)
| A=sparse([1,2],[1,2],[10,10],10,10);
disp(A)
| Initiate a sparse matrix I - row indices J - column indices K - element values nRows - no of rows nCols - no of colsB=A
| B=copy(A)
| A=rand(4)
disp(A)
B=A
B[0][0]=20
disp(A)
// note: A changes
// when B is changed
C=copy(A); C[0][0]=100
disp(A)
disp(C)
| For array and matrices B=A; will not actually copy A but only creates a reference Use B=copy(A) instead.C=A+B
| C=add(A,B)
| disp(add(3,4))
disp(add(ones(4,1),100))
disp(add(100,rand(1,4)))
disp(add(ones(4),100))
disp(add(100,rand(4)))
disp(add(ones(4),rand(4)))
| Universal add for number + number array + number array + array number + matrixC=A-B
| C=sub(A,B)
| disp(sub(3,4))
disp(sub(ones(4,1),100))
disp(sub(100,rand(1,4)))
disp(sub(ones(4),100))
disp(sub(100,rand(4)))
disp(sub(ones(4),rand(4)))
| Universal subtract for number - number array - number array - array number - matrixC=A*B
| C=mul(A,B)
| disp(mul(3,4))
disp(mul(ones(4,1),100))
disp(mul(100,rand(1,4)))
disp(mul(ones(4),100))
disp(mul(100,rand(4)))
disp(mul(ones(4),rand(4)))
disp(mul(eye(4),rand(4)))
disp(mul(rand(5,4),rand(4,3)))
disp(mul(rand(5),rand(5,1)))
disp(mul(rand(1,10),rand(10,1)))
| Universal multiply for number * number array * number array * array matrix(n by k) * matrix(k by m)C=A.*B
| C=dotmul(A,B)
| disp(dotmul(3,4))
A=ones(4)
B=rand(4)
disp(dotmul(rand(10,1),rand(10,1)))
disp(dotmul(A,B))
disp(dotmul(eye(4),B))
| Elementwise multiply for number .* number array .* array matrix .* matrixC=A/B
| C=div(A,B)
| disp(div(3,4))
disp(div(ones(4,1),100))
disp(div(100,rand(1,4)))
disp(div(ones(4),100))
disp(div(100,rand(4)))
disp(div(ones(4),rand(4)))
| Universal divide for number / number array / number array / array number / matrixC=A./B
| C=dotdiv(A,B)
| A=rand(1,4)
B=mul(100,ones(1,4))
disp(dotdiv(A,B))
C=add(rand(10),1)
disp(dotdiv(rand(10),C))
disp(dotdiv(eye(4),rand(4)))
| Elementwise divide for number ./ number array ./ array matrix ./ matrixC=A^B
| C=pow(A,B)
| disp(pow(3,4))
disp(pow(ones(4,1),100))
disp(pow(100,rand(1,4)))
disp(pow(ones(4),100))
disp(pow(100,rand(4)))
disp(pow(ones(4),rand(4)))
disp(pow(eye(4),rand(4)))
| Universal power for number ^ number array ^ number array ^ array number ^ matrix matrix ^ number matrix ^ matrixA(:)
| colon(A)
| disp(A=rand(4))
disp(colon(A))
| List all columns as vectorx=A\b
| x=linsolve(A,b)
| A=[[2,3,4],[1,1,1],[1,0,1]]
b=[[9],[3],[2]]
x=linsolve(A,b)
disp(x)
disp(mul(A,x))
| Linear solve (or) mldivide solve a sys of linear equations Uses ndarrayjs Include ndarray.js file in your project.all
| all
| all([[true,true],[true,false]])
// false
all([true,true],[true,true]])
// true
| If all elements are true, returns true Multi-dimensionalany
| any
|any([[false,false],[false,false]])
// false
any([false,false],[true,false]])
// true
| If any element is true, returns true Multi-dimensional
Not available | map(function,
arg1,arg2,arg3...)
| map(x=>x>3, [1,2,3,4,5])
// [false,false,false,true,true]
map(x=>x>3, [[1,2,3],[4,5,6]])
// [[false,false,false],
[true,true,true]]
map((a,b)=>a>b, [[1,2,3],[4,5,6]],3)
// [[false,false,false],
[true,true,true]]
map((a,b)=>a+b, [[1,2,3],[4,5,6]],3,[[1,2,3],[4,5,6]] )
// [[5,7,9],[11,13,15]]
| Multi dimensional map: Applies function across all elements, If any arg is not an array, uses the value instead Considers two arguments at a time until the lastexp
|exp(number or complex or array or complex array
|exp(1) // 2.718..
a=exp(new cx(0,Math.PI/2))
disp(a)// 0+1i i.e. a.re=0 a.im=1
| Multi dimensional universal exponention function
License
MIT License 2.0
Vivek Thaminni Ramamoorthy