{"id":19926040,"url":"https://github.com/r-js/blasjs","last_synced_at":"2025-04-05T21:05:20.559Z","repository":{"id":32483027,"uuid":"123120139","full_name":"R-js/blasjs","owner":"R-js","description":"Pure Javascript manually written :ok_hand: implementation of BLAS,   Many numerical software applications use BLAS computations, including Armadillo, LAPACK, LINPACK, GNU Octave, Mathematica, MATLAB, NumPy, R, and Julia.","archived":false,"fork":false,"pushed_at":"2023-04-10T12:42:29.000Z","size":3412,"stargazers_count":293,"open_issues_count":2,"forks_count":22,"subscribers_count":11,"default_branch":"next","last_synced_at":"2025-03-29T20:02:35.430Z","etag":null,"topics":["blas","complex-matrix","conjugate","conjugate-matrix","determinant","generalized-linear-model","lapack","linear-algebra","linear-regression","machine-learning","mathlab","matrix","neural-network","transpose-matrix","vector","vector-algebra"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/R-js.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-02-27T11:32:54.000Z","updated_at":"2025-03-22T10:38:18.000Z","dependencies_parsed_at":"2024-01-14T17:24:45.569Z","dependency_job_id":null,"html_url":"https://github.com/R-js/blasjs","commit_stats":{"total_commits":360,"total_committers":6,"mean_commits":60.0,"dds":"0.022222222222222254","last_synced_commit":"4296e4537498e29ac33499c2258295dae424478b"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/R-js%2Fblasjs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/R-js%2Fblasjs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/R-js%2Fblasjs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/R-js%2Fblasjs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/R-js","download_url":"https://codeload.github.com/R-js/blasjs/tar.gz/refs/heads/next","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247399871,"owners_count":20932876,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blas","complex-matrix","conjugate","conjugate-matrix","determinant","generalized-linear-model","lapack","linear-algebra","linear-regression","machine-learning","mathlab","matrix","neural-network","transpose-matrix","vector","vector-algebra"],"created_at":"2024-11-12T22:26:56.178Z","updated_at":"2025-04-05T21:05:20.529Z","avatar_url":"https://github.com/R-js.png","language":"TypeScript","readme":"# BLASjs  (\u003cspan style=\"font-size:small\" \u003e\u003cspan style=\"color:red; font-weight: bold;\"\u003eB\u003c/span\u003easic \u003cspan style=\"color:red; font-weight: bold;\"\u003eL\u003c/span\u003einear \u003cspan style=\"color:red; font-weight: bold;\"\u003eA\u003c/span\u003elgebra \u003cspan style=\"color:red; font-weight: bold;\"\u003eS\u003c/span\u003eubprograms\u003c/span\u003e)\n\nThis is a 100% Pure Javascript ( TypeScript ) re-write of the reference implementation `Basic Linear Algebra SubPrograms` (BLAS) numerical library found [here][blas-site].\nThis is a full manual re-write, [\"emscripten\"](https://kripken.github.io/emscripten-site) was not used.\n\n#### summary\n\nBLASjs contains all the functions (Complex, Real) of the reference implementation capable for `32 bit` and `64 bit` floating point arithmatic:\n\n* :ok_hand: 100% code coverage\n* 1005 tests\n* Output off all tests equal to the BLAS FORTRAN reference implementation.\n* Level 1: all vector-vector operations implemented.\n* Level 2: all vector-matrix operations implemented.\n* Level 3: all matrix-matrix operations implemented.\n* Helper functions to ease the porting of FORTRAN BLAS usage to Javascript.\n\n#### Node and Web\n\nThe resulting bundled `blasjs` file is an agnostic UMD library, it can be used in a web client\nas-well as in a server side node environment.\n\n[![Slack](https://slack.bri.im/badge.svg)](https://slack.bri.im)\n\n## Installation\n\n#### node\n\n```bash\n$ npm i blasjs\n```\n\nUsage:\n\n```javascript\n//node\n   const blas = require('blasjs');\n//or typescript\n   import * as blas from 'blasjs';\n```\n\n#### web\n\nThe module directory contains a standalone bundle for use in html `\u003cscript\u003e` insertion. The library assigns `window.BLAS` after loading.\n\n```html\n\u003c!-- \u003cscript src=\"your_server_url/blasjs.min.js\"\u003e\u003c/script\u003e --\u003e\n\u003c!-- this example uses unpkg as CDN --\u003e\n\u003cscript src=\"https://unpkg.com/blasjs@latest/dist/lib/blasjs.min.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  const blas = window.BLAS; //UMD exposes it as BLAS\n\n  //fetch some level3 complex 64 bit precision matrix-matrix operations\n  const {\n      level3: { zsyrk, ztrmm, ztrsm }\n   } = blas;\n\u003c/script\u003e\n```\n\n# Table of Contents\n\n- [BLASjs  (\u003cspan style=\"font-size:small\" \u003e\u003cspan style=\"color:red; font-weight: bold;\"\u003eB\u003c/span\u003easic \u003cspan style=\"color:red; font-weight: bold;\"\u003eL\u003c/span\u003einear \u003cspan style=\"color:red; font-weight: bold;\"\u003eA\u003c/span\u003elgebra \u003cspan style=\"color:red; font-weight: bold;\"\u003eS\u003c/span\u003eubprograms\u003c/span\u003e)](#blasjs-basic-linear-algebra-subprograms)\n      - [summary](#summary)\n      - [Node and Web](#node-and-web)\n  - [Installation](#installation)\n      - [node](#node)\n      - [web](#web)\n- [Table of Contents](#table-of-contents)\n- [Language differences with FORTRAN/BLAS](#language-differences-with-fortranblas)\n- [Helper functions](#helper-functions)\n  - [Types](#types)\n    - [`fpArray`](#fparray)\n    - [`FortranArr`](#fortranarr)\n    - [`Type Complex`](#type-complex)\n    - [`Matrix`](#matrix)\n      - [Float[32/64]Array Complex number storage for Matrix.](#float3264array-complex-number-storage-for-matrix)\n      - [Handling FORTRAN matrices (multidimensional Arrays).](#handling-fortran-matrices-multidimensional-arrays)\n      - [Performance](#performance)\n      - [Creating new transformed Matrix instances from existing ones](#creating-new-transformed-matrix-instances-from-existing-ones)\n      - [`Matrix.prototype.slice`](#matrixprototypeslice)\n      - [`Matrix.prototype.setLower`](#matrixprototypesetlower)\n      - [`Matrix.prototype.setUpper`](#matrixprototypesetupper)\n      - [`Matrix.prototype.upperBand`](#matrixprototypeupperband)\n      - [`Matrix.prototype.lowerBand`](#matrixprototypelowerband)\n      - [`Matrix.prototype.real`](#matrixprototypereal)\n      - [`Matrix.prototype.imaginary`](#matrixprototypeimaginary)\n      - [Packed Matrices](#packed-matrices)\n      - [`Matrix.prototype.packedUpper`](#matrixprototypepackedupper)\n      - [`Matrix.prototype.packedLower`](#matrixprototypepackedlower)\n      - [Convert Matrix object to a JS array](#convert-matrix-object-to-a-js-array)\n      - [`Matrix.prototype.toArr`](#matrixprototypetoarr)\n      - [Summary: Full type declaration of Matrix](#summary-full-type-declaration-of-matrix)\n      - [Matrix Examples](#matrix-examples)\n  - [General Helpers](#general-helpers)\n    - [`arrayrify`](#arrayrify)\n    - [`complex`](#complex)\n    - [`each`](#each)\n    - [`map`](#map)\n    - [`muxCmplx`](#muxcmplx)\n    - [`numberPrecision`](#numberprecision)\n  - [Vector Constructors](#vector-constructors)\n    - [`fortranArrComplex32`](#fortranarrcomplex32)\n    - [`fortranArrComplex64`](#fortranarrcomplex64)\n      - [Vector creation examples](#vector-creation-examples)\n  - [Matrix Constructors](#matrix-constructors)\n    - [`fortranMatrixComplex32`](#fortranmatrixcomplex32)\n    - [`fortranMatrixComplex64`](#fortranmatrixcomplex64)\n    - [Matrix Creation Examples](#matrix-creation-examples)\n- [A note on numeric precision](#a-note-on-numeric-precision)\n- [Mimicking FORTRAN OUT Arguments](#mimicking-fortran-out-arguments)\n- [Level 1 routines](#level-1-routines)\n  - [Euclidean norm: √(xᴴ·x)  or √(xᵀ·x)](#euclidean-norm-xᴴx-or-xᵀx)\n    - [scrnm2/dznrm2, snrm2/dnrm2](#scrnm2dznrm2-snrm2dnrm2)\n  - [Construct a Givens plane rotation](#construct-a-givens-plane-rotation)\n    - [srotg/drotg, crotg/zrotg](#srotgdrotg-crotgzrotg)\n  - [Construct the **modified** Givens rotation matrix `H`](#construct-the-modified-givens-rotation-matrix-h)\n    - [srotmg/drotmg](#srotmgdrotmg)\n  - [Apply the modified Givens Transformation](#apply-the-modified-givens-transformation)\n    - [srotm/drotm](#srotmdrotm)\n  - [Applies a plane rotation](#applies-a-plane-rotation)\n    - [srot/drot, csrot/zdrot](#srotdrot-csrotzdrot)\n  - [Scale a vector by a constant](#scale-a-vector-by-a-constant)\n    - [sscal/dscal, cscal/zscal, csscal/zdscal](#sscaldscal-cscalzscal-csscalzdscal)\n  - [Takes the sum of the absolute values of the components of vector](#takes-the-sum-of-the-absolute-values-of-the-components-of-vector)\n    - [sasum/dasum, scasum/dzasum](#sasumdasum-scasumdzasum)\n  - [Interchanges 2 vectors](#interchanges-2-vectors)\n    - [sswap/dswap, cswap/zswap](#sswapdswap-cswapzswap)\n  - [Dot product of two complex vectors](#dot-product-of-two-complex-vectors)\n    - [cdotu/cdotc, zdotu/zdotc](#cdotucdotc-zdotuzdotc)\n  - [Dot product of two non complex vectors](#dot-product-of-two-non-complex-vectors)\n    - [sdot/ddot, sdsdot/dsdot](#sdotddot-sdsdotdsdot)\n  - [Finds the index of the first element having maximum absolut value.](#finds-the-index-of-the-first-element-having-maximum-absolut-value)\n    - [isamax/idamax, icamax/izamax](#isamaxidamax-icamaxizamax)\n  - [Copy a vector x to a vector y](#copy-a-vector-x-to-a-vector-y)\n    - [scopy/dcopy, ccopy/zcopy](#scopydcopy-ccopyzcopy)\n  - [Constant times a vector plus a vector](#constant-times-a-vector-plus-a-vector)\n    - [saxpy/daxpy, caxpy/zaxpy](#saxpydaxpy-caxpyzaxpy)\n- [Level 2 Routines](#level-2-routines)\n  - [The hermitian rank 2 operation A ⟵ α·x·yᴴ + conjg( α )·y·xᴴ + A](#the-hermitian-rank-2-operation-a--αxyᴴ--conjg-α-yxᴴ--a)\n    - [cher2/zher2, chpr2|zhpr2](#cher2zher2-chpr2zhpr2)\n  - [The symmetric rank 2 operation A ⟵ α·x·yᵀ + α·y·xᵀ + A](#the-symmetric-rank-2-operation-a--αxyᵀ--αyxᵀ--a)\n    - [sspr2/dspr2, ssyr2/dsyr2](#sspr2dspr2-ssyr2dsyr2)\n  - [The rank 1 operation A ⟵ α·x·yᴴ + A or A ⟵ α·x·yᵀ + A](#the-rank-1-operation-a--αxyᴴ--a-or-a--αxyᵀ--a)\n    - [sger/dger, cgerc/zgerc, cgeru/zgeru](#sgerdger-cgerczgerc-cgeruzgeru)\n  - [The hermitian rank 1 operation A ⟵ α·x·xᴴ + A](#the-hermitian-rank-1-operation-a--αxxᴴ--a)\n    - [Naming](#naming)\n  - [The symmetric rank 1 operation A ⟵ α·x·xᵀ + A](#the-symmetric-rank-1-operation-a--αxxᵀ--a)\n    - [sspr/dspr, ssyr/dsyr](#ssprdspr-ssyrdsyr)\n  - [The matrix-vector operation, y ⟵ α·A·x + β·y, or y ⟵ α·Aᵀ·x + β·y or y ⟵  α·Aᴴ·x + β·y](#the-matrix-vector-operation-y--αax--βy-or-y--αaᵀx--βy-or-y--αaᴴx--βy)\n    - [cgbmv/zgbmv, chbmv/zhbmv, ssbmv/dsbmv, sgbmv/dgbmv, stbmv/dtbmv, chemv/zhemv, sgemv/dgemv, cgemv/zgemv, chpmv/zhpmv, sspmv/dspmv, ssymv/dsymv](#cgbmvzgbmv-chbmvzhbmv-ssbmvdsbmv-sgbmvdgbmv-stbmvdtbmv-chemvzhemv-sgemvdgemv-cgemvzgemv-chpmvzhpmv-sspmvdspmv-ssymvdsymv)\n  - [The matrix-vector operation, x ⟵ A·x, or x ⟵ Aᵀ·x, or x ⟵ Aᴴ·x](#the-matrix-vector-operation-x--ax-or-x--aᵀx-or-x--aᴴx)\n    - [stbmv, dtbmv, ctbmv, dtpmv, ctpmv, ztpmv, strmv, dtrmv, ctrmv, ztrmv](#stbmv-dtbmv-ctbmv-dtpmv-ctpmv-ztpmv-strmv-dtrmv-ctrmv-ztrmv)\n  - [Solves a systems of equations A·x = b, or Aᵀ·x = b, or Aᴴ·x = b](#solves-a-systems-of-equations-ax--b-or-aᵀx--b-or-aᴴx--b)\n    - [stbsv, dtbsv, ctbsv, ztbsv, stpsv, dtpsv, ctpsv, ztpsv, ctrsv, ztrsv, strs, dtrsv](#stbsv-dtbsv-ctbsv-ztbsv-stpsv-dtpsv-ctpsv-ztpsv-ctrsv-ztrsv-strs-dtrsv)\n- [Level 3 Routines](#level-3-routines)\n  - [Hermitian rank 2k: C ⟵ α·A·Bᴴ + con( α )·B·Aᴴ + β·C or C ⟵ α·Aᴴ·B + con( α )·Bᴴ·A + β·C](#hermitian-rank-2k-c--αabᴴ--con-α-baᴴ--βc-or-c--αaᴴb--con-α-bᴴa--βc)\n    - [cher2k, zher2k](#cher2k-zher2k)\n  - [Symmetric rank 2k operations C ⟵ α·A·Bᵀ + α·B·Aᵀ + β·C, or C ⟵ α·Aᵀ·B +  α·Bᵀ·A + β·C](#symmetric-rank-2k-operations-c--αabᵀ--αbaᵀ--βc-or-c--αaᵀb--αbᵀa--βc)\n    - [ssyr2k, dsyr2k, csyr2k, zsyr2k](#ssyr2k-dsyr2k-csyr2k-zsyr2k)\n  - [Hermatian rank k operations C ⟵ α·A·Aᴴ + β·C, or C ⟵ α·Aᴴ·A + β·C](#hermatian-rank-k-operations-c--αaaᴴ--βc-or-c--αaᴴa--βc)\n    - [cherk, zherk](#cherk-zherk)\n  - [Symmetric rank k operations C ⟵ α·A·Aᵀ + β·C, or C ⟵ α·Aᵀ·A + β·C](#symmetric-rank-k-operations-c--αaaᵀ--βc-or-c--αaᵀa--βc)\n    - [ssyrk, dsyrk, csyrk, zsyrk](#ssyrk-dsyrk-csyrk-zsyrk)\n  - [Matrix-matrix operations C ⟵ α·_f(A)_·_h(B)_ + β·C or C ⟵ α·_h(B)_·_f(A)_ + β·C](#matrix-matrix-operations-c--αfahb--βc-or-c--αhbfa--βc)\n    - [sgemm,  dgemm, cgemm, zgemm](#sgemm-dgemm-cgemm-zgemm)\n  - [Matrix-matrix operations C ⟵ α·A·B + β·C or C ⟵ α·B·A + β·C](#matrix-matrix-operations-c--αab--βc-or-c--αba--βc)\n    - [chemm, zhemm, ssymm, dsymm, csymm, zsymm](#chemm-zhemm-ssymm-dsymm-csymm-zsymm)\n  - [Matrix-matrix operations B ⟵ α·f(A)·B or B ⟵ α·B·f(A)](#matrix-matrix-operations-b--αfab-or-b--αbfa)\n    - [strmm, dtrmm, ctrmm, ztrmm](#strmm-dtrmm-ctrmm-ztrmm)\n  - [Solves the matrix equations: _f( A )_·X = α·B, or X·_f( A )_ = α·B](#solves-the-matrix-equations-f-a-x--αb-or-xf-a---αb)\n    - [strsm, dtrsm, ctrsm, ztrsm](#strsm-dtrsm-ctrsm-ztrsm)\n\n\n# Language differences with FORTRAN/BLAS\n\nFORTRAN language can instrinsicly work with non-zero based multidimensional arrays and complex numbers. Below are some examples from FORTRAN that have no Javascript counterpart. The reference implementation of BLAS functions expect inputs of these types.\n\n_The FORTRAN complex scalar, complex array and complex \"Matrix\"_\n\n```fortran\n!    double precision Complex number\n     COMPLEX*16 alpha\n!\n!    double precision Complex array with offset 2\n     COMPLEX*16 vector(2,10)\n!\n!    double precision complex MultiDimensional Array (matrix)\n!    rows 1 to 5 , columns 1 to 10\n     COMPLEX*16 A(1:5,1:10)\n```\n\nTo work with the concept of non-zero based arrays and complex numbers in JS,\nthese FORTRAN constructs have equivalents in the `blasjs` library.\n\n_The `blasjs` helpers to create complex scalar, complex array and complex \"Matrix\" objects_\n\n```javascript\n  const blas = require('blasjs');\n\n  const {\n      helper:{\n        /* create complex Object from 2 real numbers */\n        complex,\n\n        /* create single precision Real/complex arrays, */\n        fortranArrComplex32,\n\n        /* create double precision Real/Complex arrays */\n        fortranArrComplex64,\n\n        /* create single precision 2 dimensional Real/Complex arrays */\n        fortranMatrixComplex32,\n\n        /* Double precision 2 dimensional Real/Complex arrays */\n        fortranMatrixComplex64,\n      }\n  } = blas;\n```\n\nThese functions are extensively documented in the [helper functions](#helper-functions-for-working-with-blasjs).\nIt is recommended you read this introductory part of the documentation first.\nbefore anything else.\n\n# Helper functions\n\n`blasjs` uses \"FORTRAN like\" complex number 32/64 bit precision multidimensional complex/real data.\nThese helper functions have been designed to significantly ease the use of working with these\ndata types in JavaScript.\n\n## Types\n\nTypescript types/interfaces to mimic FORTRAN native (complex) multidimensional arrays.\n\n### `fpArray`\n\nWraps JS types [Float32Array][float32-array] and [Float64Array][float64-array] into a single type.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_:\n\n```typescript\nexport type fpArray = Float32Array | Float64Array;\n```\n\n\u003c/details\u003e\n\n### `FortranArr`\n\nAbstraction of a 1 dimensional single/double precision complex/real FORTRAN array.\nUsed by [level 1](#level-1) and [level 2](#level-2) `blasjs` functions.\n`FortranArr`objects should be created by the [`fortranArrComplex32`][float32-array] and [`fortranArrComplex64`][float64-array] helper functions.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_:\n\n```typescript\nexport declare type FortranArr = {\n    base: number;\n    r: fpArray;\n    i?: fpArray;\n    s: (index: number) =\u003e (re?: number, im?: number) =\u003e number | Complex;\n    toArr: () =\u003e Complex[] | number[];\n};\n```\n\nfields:\n\n* `base`: fortran by default has a 1-value based array. Mimiced by this property.\n* `r`: See decl [fpArray](#fpArray). The Real part of complex array.\n* `i`: (optional). See decl [fpArray](#fpArray). The Imaginary part of the complex array.\n* `s`: set, get values of the array. Uses FORTRAN style array indexes taking the value of `base` into account.\n* `toArr` generates an JavaScript array from the `r` and `i` (optional) data.\n\nUsage:\n\n```javascript\nconst blas = require('blasjs');\n\nconst { helper: { fortranArrComplex64 } } = blas;\n\n// You can also use the helper \"complex\" or \"muxComplex\"\n// to generate JS complex arrays\nconst complexDataArr = [\n    { re: 1.8, im: -0.2 },\n    { re: 2.3, im: 0.6 }\n];\n\n// Create an object that mimics FORTRAN COMPLEX*16 SP(2:3)\n//    and fill it with above data\nconst sp = fortranArrComplex64(complexArr)(2);\n\n// fast! normal JS TypedArray access\nlet re = sp.r[ 2 - sp.base ];\n// 1.8\n\nlet  im = sp.i[ 2 - sp.base ];\n// -0.2\n\n// not so fast, but easier syntax\nlet v = sp.s(2)(); // Terse syntax,\n// { re: 1.8, im: -0.2 }\n\n// sets the value at index 3 to complex: 0.11 - i0.9\n//      and returns the old value: 2.3 + i0.6\nlet old = sp.s(3)(0.11, -0.9);\n\nsp.toArr();\n// [ { re:1.8, im: -0.2 },\n//   { re:0.11, im: -0.9 } ]\n```\n\n_Usage TypeScript:_\n\n```typescript\nimport {\n    // pure types\n    Complex,\n    fpArray,\n    FortranArr,\n    // helper\n    helper\n} from 'blasjs';\n\nconst { fortranArrComplex64 } = helper;\n\nconst complexArr: Complex[] [\n    { re: 1.8, im: -0.2 },\n    { re: 2.3, im: 0.6 }\n];\n\n// Create an object that mimics FORTRAN COMPLEX*16 SP(2:3)\n//    and fill it with above data\nconst sp: FortranArr = fortranArrComplex64(complexArr)(2);\n\nlet re = sp.r[ 2 - sp.base ]; //fastest! direct TypedArray access\n// 1.8\n\nlet  im = sp.i[ 2 - sp.base ]; //fastest! direct TypedArray access\n// -0.2\n\n// not so fast, but easier syntax\nlet v = sp.s(2)(); // Terse syntax,\n// { re: 1.8, im: -0.2 }\n\n// sets the value at index 3 to complex: 0.11 - i0.9\n//      and returns the old value: 2.3 + i0.6\nlet old = sp.s(3)(0.11, -0.9);\n// {re: 2.3, im: 0.6 }\n```\n\n\u003c/details\u003e\n\n### `Type Complex`\n\nTypescript definition of a complex scalar.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_:\n\n```typescript\ndeclare type Complex = {\n   re: number;\n   im?: number;\n}\n```\n\nUsage:\n\n```typescript\nimport { Complex /* pure type */ } from 'blasjs';\n\nconst complexArr: Complex[] [\n    { re: 1.8, im: -0.2 },\n    { re: 2.3, im: 0.6 }\n];\n```\n\n\u003c/details\u003e\n\n### `Matrix`\n\nThe `Matrix` object is the input of many level-2 and level-3 `blasjs` functions.\n`Matrix` is created by the helpers [fortranMatrixComplex32](#fortranMatrixComplex32) and\n[fortranMatrixComplex64](#fortranMatrixComplex64).\n`Matrix` encapsulates objects of [Float32Array][float32-array] or [Float64Array][float64-array], the blasjs.\n\nIn this section the internals of `Matrix` are explained in detail and how `blasjs` accesses the data in the JS TypesArrays.\n\n#### Float[32/64]Array Complex number storage for Matrix.\n\nThe `Matrix` object has 2 properties `r` and `i` for respectively real and imaginary parts of matrix elements. These are the actual aforementioned JS TypedArrays. The imaginary property part is optional if it is not defined the Matrix represents solely an array of real elements.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```typescript\ndeclare type Matrix = { //Incomplete declaration\n    .\n    r: Float64Array|Float32Array;\n    i: Float64Array|Float32Array;\n    .\n}\n```\n\n\u003c/details\u003e\n\n#### Handling FORTRAN matrices (multidimensional Arrays).\n\nContrary to languages like JavaScript. FORTRAN defines arrays ( aka `DIMENSIONS` in FORTRAN lingo ) as 1 based arrays by default.. This can be changed by specifying a different base in the declaration.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\nSome examples:\n\n```fortran\n       DOUBLE PRECISION A1(4)  ! array indexes 1,2,3,4\n       DOUBLE PRECISION A2(-1:3)  ! array indexes -1,0,2,3\n       DOUBLE PRECISION A3(0:3) ! Javascript like Array with 4 elements\n```\n\nThis expands to 2-dimensional arrays (matrices).\n\n```fortran\n! (default) first index loops from 1 to 4(inclusive), second index loops from 1 to 5(inclusive)\n       DOUBLE PRECISION A1(4,5)\n! first index loops from -2 to 4(inclusive), second index loops from -5 to -7(inclusive)\n       DOUBLE PRECISION A2(-2:4,-5:-7)\n```\n\nThe values of the FORTRAN array basis are preserved as `rowBase` (first index) and `colBase` (second index).\n\n```typescript\ndeclare type Matrix = { //SHOW PARTIAL TYPE\n    .\n    rowBase: number;\n    colBase: number;\n    .\n}\n```\n\nJavaScript doesn't have the notion of `typed 2-dimensional arrays`. The `Matrix` objects handles this by mapping 2 dimensional arrays to single 1-dimensional array, by serializing data on a column-first basis.\n\nFor example the elements 2x2 Matrix will be mapped in a TypedArray as:\n\n```bash\nmatrix A =\n *           *\n | a11  a12  |\n | a21  a22  |\n *           *\n\n# Stored in TypedArray as\nAt = [a11,a21, a12, a22]\n```\n\nIn case of complex values for A, the real part will be stored in `r` and the imaginary part in `i` each in the same column-first manner.\n\n\u003c/details\u003e\n\n#### Performance\n\nDirect access to TypedArrays within the `Matrix` object is the preferable way to get/set matrix data.\nSince BLAS (and therefore `blasjs`) functions access matrices mostly to iterate over matrix row's first . It was decided to story 2 dimensional an a column-first basis.\n\nTo help with the calculation of finding/setting an element A(i,j) in `Matrix` the following helper member functions have been added to `Matrix`.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```typescript\ndeclare type Matrix = { //SHOW PARTIAL TYPE\n    .\n    rowBase: number;\n    colBase: number;\n    nrCols: number;\n    nrRows: number;\n    .\n    colOfEx(number): number;\n    coord(col): (row) =\u003e number;\n    setCol(col: number, rowStart: number, rowEnd: number, value: number): void;\n    .\n}\n```\n\n\u003c/details\u003e\n\nExplanation:\n\n* `nrRows`: The number of rows in the matrix.\n* `nrCols`: The number of columns in the matrix.\n* `colofEx`: Calculates the physical location of a `column offset` within the `TypedArray`. Taking int account the column base `colBase` and row base `colBase`. The index of  A(i,j) `=  (j - colBase)*nrRows + i - rowBase`.\n* `coord`: Curried, emulates non-zero based FORTRAN index values for 2 dimensional Arrays. The index that is iterated over the least (usually) is used as the first to create the curried function.\n* `setCol`: Uses underlying `TypedArray`, `fill` method to set multiple column elements to a single value.\n\n_[See Example](#matrix-examples)_\n\n#### Creating new transformed Matrix instances from existing ones\n\nOne can create/transform new Matrix instances form existing onces. A copy of all relevant data is made into the new `Matrix` instance.\n\n#### `Matrix.prototype.slice`\n\nSlices a rectangular piece of data out of an matrix into a new `Matrix` instance. **All arguments are FORTRAN-style non-zero based indexes**.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```typescript\ndeclare type Matrix = { // only \"slice\" is shown\n   .\n   slice(rowStart: number, rowEnd: number, colStart: number, colEnd: number): Matrix;\n   .\n}\n```\n\n* `rowStart`: The row in the matrix to begin slicing.\n* `rowEnd`: The last row to include in the slice.\n* `colStart`: The column in the matrix to begin slicing.\n* `colEnd`: The last column to include in the slice.\n\n_[See Example](#matrix-examples)_\n\n\u003c/details\u003e\n\n#### `Matrix.prototype.setLower`\n\nReturns a new Matrix where everything below the matrix diagonal is set to a `value`.\nSets the real (and imaginary part, if it exist) to said value.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```typescript\ndeclare type Matrix = { // only \"setLower\" is shown.\n  .\n  setLower(value = 0): Matrix;\n  .\n}\n```\n\n_[See Example](#matrix-examples)_\n\n\u003c/details\u003e\n\n#### `Matrix.prototype.setUpper`\n\nReturns a new Matrix where everything _below_ the matrix diagonal is set to a `value`.\nSets the real (and imaginary part, if it exist) to said value.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```typescript\ndeclare type Matrix = { //only \"setUpper\" is shown\n  .\n  setUpper(value = 0): Matrix;\n  .\n}\n```\n\n_[See Example](#matrix-examples)_\n\n\u003c/details\u003e\n\n#### `Matrix.prototype.upperBand`\n\nReturns a new `Matrix` object where the `k` super-diagonals are retained into the new copy.\nThe efficient storage format of `BLAS` band matrices is used.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```typescript\ndeclare type Matrix = { //only \"upperBand\" is shown\n  .\n  upperBand(k = nrRows - 1): Matrix;\n  .\n}\n```\n\nThe default value for `k` is the the maximum size possible for the number of super-diagonals: ( `nrRows-1` )\n\n_[See Example](#matrix-examples)_\n\n\u003c/details\u003e\n\n#### `Matrix.prototype.lowerBand`\n\nReturns a new `Matrix` object where the `k` sub-diagonals are retained into the new copy.\nThe efficient storage format of `BLAS` band matrices is used.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```typescript\ndeclare type Matrix = { // Only \"lowerBand\" is shown\n  .\n  lowerBand(k = nrRows-1): Matrix;\n  .\n}\n```\n\nThe default value for `k` is the the maximum size possible for the number of sub-diagonals: ( `nrRows-1` )\n\n_[See Example](#matrix-examples)_\n\n\u003c/details\u003e\n\n#### `Matrix.prototype.real`\n\nReturns a new `Matrix` object where with only real elements (omits the imaginary part during copy).\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```typescript\ndeclare type Matrix = { // Only \"real\" is shown\n  .\n  real(): Matrix;\n  .\n}\n```\n\n_[See Example](#matrix-examples)_\n\n\u003c/details\u003e\n\n#### `Matrix.prototype.imaginary`\n\nReturns a new `Matrix` object where with only imaginary part of the element (omits the real part during copy).\n**If there were now imaginary elements**\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```typescript\ndeclare type Matrix = { // Only \"imaginary\" is shown.\n  .\n  imaginary(): Matrix;\n  .\n}\n```\n\n_[See Example](#matrix-examples)_\n\n\u003c/details\u003e\n\n#### Packed Matrices\n\nBLAS ( and therefore `blasjs` ) can work with upper/lower-matrices and band-matrices in the most compacted form, aka `packed matrices`.\nWith `packed matrices` there are no unused elements in the matrix (no zeros). Packed matrices are instances of [FortranArr](#fortranarr). BLAS reference implementation in FORTRAN uses 1 dimensional arrays as an analog.\n\n#### `Matrix.prototype.packedUpper`\n\nCreates a packed array from a normal/upper Matrix only referencing the diagonal and super-diagonals.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```typescript\ndeclare type Matrix = { // Only \"packedUpper\" is shown.\n  .\n  packedUpper(k = nrRows-1): FortranArr;\n  .\n}\n```\n\n_[See Example](#matrix-examples)_\n\nThe default value for `k` is the the maximum size possible for the number of super-diagonals: ( `nrRows-1` )\n\n\u003c/details\u003e\n\n#### `Matrix.prototype.packedLower`\n\nCreates a packed array from a normal/upper Matrix only referencing the diagonal and sub-diagonals.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```typescript\ndeclare type Matrix = { // Only \"packedUpper\" is shown.\n  .\n  packedLower(k = nrRows-1): FortranArr;\n  .\n}\n```\n\n_[See Example](#matrix-examples)_\n\nThe default value for `k` is the the maximum size possible for the number of sub-diagonals: ( `nrRows-1` )\n\n```typescript\ndeclare type Matrix = { // Only \"packedUpper\" is shown.\n  .\n  packedLower(k = nrRows - 1): FortranArr;\n  .\n}\n```\n\nThe default value for `k` is the the maximum size possible for the number of sub-diagonals: ( `nrRows - 1` )\n\n\u003c/details\u003e\n\n#### Convert Matrix object to a JS array\n\nThe `Matrix` object can convert the underlying TypedArray(s) to real JavaScript arrays.\n\n#### `Matrix.prototype.toArr`\n\nCreates a normal JS Array with element of type 'number' or of type [Complex](#type-complex)\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```typescript\ndeclare type Matrix = { // Only \"toArr\" is shown.\n  .\n  toArr(): number[]|Complex[];\n  .\n}\n```\n\n_[See Example](#matrix-examples)_\n\n\u003c/details\u003e\n\n#### Summary: Full type declaration of Matrix\n\nPutting it all together, here is the full type declaration of `Matrix`:\n\n```typescript\ndeclare type Matrix = {\n     rowBase: number;\n     colBase: number;\n     nrCols: number;\n     nrRows: number;\n     r: fpArray;\n     i?: fpArray; //optional\n     //\n     // methods\n     //\n     colOfEx(column: number): void;\n     coord(col: number): (row: number): void;\n     setCol(col: number, rowStart: number, rowEnd: number, value: number): void;\n     //\n     slice(rowStart: number, rowEnd: number, colStart: number, colEnd: number): Matrix;\n     setLower(value?: number): Matrix;\n     setUpper(value?: number): Matrix;\n     upperBand(k: number): Matrix;\n     lowerBand(k: number): Matrix;\n     real(): Matrix;\n     imaginary(): Matrix;\n     //\n     packedUpper(value?: number): FortranArr;\n     packedLower(value?: number): FortranArr;\n     //\n     toArr(): Complex[] | number[];\n}\n```\n\n#### Matrix Examples\n\nCommon usage of the Matrix type.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```javascript\nconst blas = require('../blasjs');\nconst { fortranMatrixComplex64 } = blas.helper;\n\n// some matrix data 3x3 array  aka a_row_column\n\nconst a11 = { re: .2, im: -.11 };\nconst a21 = { re: .1, im: -.2 };\nconst a31 = { re: .3, im: .9 };\nconst a12 = { re: .4, im: .5 };\nconst a22 = { re: .9, im: -.34 };\nconst a32 = { re: -.2, im: .45 };\nconst a13 = { re: -.1, im: .89 };\nconst a23 = { re: .43, im: .23 };\nconst a33 = { re: .23, im: .56 };\n\n//create Matrix A\nconst A = fortranMatrixComplex64([\n    a11, a21, a31, a12, a22, a32, a13, a23, a33\n])(3, 3);\n\n// get the second column\nconst columnj = A.colOfEx(3); // formula: (j - colBase )* nrRows\n\nA.r[A.coord(1, 2)] === a12.re // true\n\nA.slice(1, 2,  2, 3);// creates new matrix with elements from A\n/*[\n    a12 a13\n    a22 a23\n]*/\n\nA.setLower(0); // creates new Matrix object from A\n/*[\n    a11 a12 a13\n    0   a22 a23\n    0   0   a33\n]*/\n\nA.setUpper(0); //creates new Matrix object from A\n/*[\n    a11 0   0\n    a21 a22 0\n    a31 a32 a33\n]*/\n\nA.upperBand(1); // banded array storage for BLAS(js)\n/*[\n    0   a12   a23\n    a11 a22   a33\n]*/\n\nA.lowerBand(1); // banded array storage for BLAS(js)\n/*[\n   a11  a22  a33\n   a21  a32  0    \n]*/\n\nconst Areal = A.real();\n// Areal.i is undefined\n// Areal.r =\n/*[\n    0.2 0.4  -0.1\n    0.1 0.9   0.43\n    0.3 -0.2, 0.23\n]*/\n\nconst Aimag = A.imaginary();\n// imaginary parts are copied to real side in new Matrix\n// Aimag.i is undefined\n// Aimag.r =\n/*[\n    -0.11   0.5,  0.89\n     -0.2  -0.34  0.23\n      0.9   0.45  0.56\n]*/\n\nA.packedUpper(1)\n/* [ a11 a12 a22 a23 a 33] */\n\nA.packedLower(1)\n/* [ a11 a21 a22 a32 a33] */\n\nA.toArr(); // returns JavaScript Array\n/*[\n  { re: 0.2, im: -0.11 },\n  { re: 0.1, im: -0.2 },\n  { re: 0.3, im: 0.9 },\n  { re: 0.4, im: 0.5 },\n  { re: 0.9, im: -0.34 },\n  { re: -0.2, im: 0.45 },\n  { re: -0.1, im: 0.89 },\n  { re: 0.43, im: 0.23 },\n  { re: 0.23, im: 0.56 }\n]\n*/\n```\n\n\u003c/details\u003e\n\n## General Helpers\n\nCollection of helper function to manipulate common JS array and object types in a functional way.\n\n### `arrayrify`\n\nCreates a new function from an existing one, to add the ability to accept vectorized input.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_Example_:\n\n```javascript\nconst blas = require('blasjs');\n\nconst { helper: { arrayrify } } = blas;\nconst PI = Math.PI;\n//\nconst sin = arrayrify(Math.sin)\n\nsin([PI/3, PI/4, PI/6]); // returns array aswell\n// [ 0.866025, 0.7071067811, 0.5 ]\n\nsin(PI/3); // returns scalar\nsin( [ PI/3 ] ); // returns scalar\n// 0.866025\n\nsin([]) // edge case\n// undefined\n\nsin() //\n//NaN  same as Math.sin()\n```\n\n\u003c/details\u003e\n\n### `complex`\n\nMimics the GNU Fortran extension [complex](https://gcc.gnu.org/onlinedocs/gfortran/COMPLEX.html).\nCreates a JS object that represents a complex scalar number.\nUsed by `blasjs` for scalar input arguments.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_Example_:\n\n```javascript\nconst blas = require('blasjs');\n\nconst { helper: { complex } } = blas;\n\nconst c1 = complex(0.1,0.3);\n//c1 = { re: 0.1, im: 0.3 }\n\nconst c2 = complex();\n//c2 = { re: 0, im: 0 }\n\nconst c3 = complex(0.5);\n//c3 = { re: 0.5, im:0 }\n```\n\n\u003c/details\u003e\n\n### `each`\n\nCurried functional analog to `Array.prototype.forEach`, but takes arbitrary input.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_Example_:\n\n```javascript\nconst blas = require('blasjs');\n\nconst { helper: { each } } = blas;\n\n//Iterates over an object like a map\nconst curry1 = each( {  hello: 'world', ts: new Date() })\ncurry1( (val, key) =\u003e console.log(`${val} ':'  ${key}`)))\n//world: hello\n//2018-05-10T13:57:08.923Z : ts\n\n//Handles array also\neach( ['a','b','c','d'])( (v,idx) =\u003econsole.log(v,idx, typeof idx))\n//a 0 number\n//b 1 number\n//c 2 number\n//d 3 number\n\n//Edge cases\neach()(console.log)\n//nothing happens\n\neach(null)(console.log)\n//nothing happens\n\neach([])(console.log)\n//nothing happens\n```\n\n\u003c/details\u003e\n\n### `map`\n\nCurried functional analog to `Array.prototype.map`, but takes arbitrary input.\n\n:warning: Forces the output to be a an array regardless of the input.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eExample\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_Example_:\n\n```javascript\nconst blas = require('blasjs');\n\nconst { helper: { map } } = blas;\n\n//trivial\nmap([1,2,3])(v=\u003ev*2);\n//[ 2, 4, 6 ]\n\n//key properties\nmap({ a:'A', b:'B' })( (val, key) =\u003e key+'='+val);\n//[ 'a=A', 'b=B' ]\n\nmap(null)( v =\u003e '/'+v);\n//[]\n\nmap()( v =\u003e '/'+v);\n//[]\n\nmap()()\n//[]\n```\n\n\u003c/details\u003e\n\n### `muxCmplx`\n\nCreates an array of complex numbers from arrayed input.\nThe result is always an array type.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eExample\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_Example_:\n\n```javascript\nconst blas = require('blasjs');\n\nconst { helper: { muxCmplx } } = blas;\n\nconst reals = [ 0.1, -0.2, 0.3, 0.45 ];\nconst imaginary = [ 0.1, -0.2, 0.3, 0.45 ];\n\n// normal usage\nmuxCmplx(reals, imaginary)\n/*[ { re: 0.1, im: 0.1 },\n    { re: -0.2, im: -0.2 },\n    { re: 0.3, im: 0.3 },\n    { re: 0.45, im: 0.45 } ]*/\n\n//R recycling rule is used\nmuxCmplx([1,2], imaginary)\n/*^[ { re: 1, im: 0.1 },\n     { re: 2, im: -0.2 },\n     { re: 1, im: 0.3 },\n     { re: 2, im: 0.45 } ]*/\n\n//dont care about imaginary\nmuxCmplx(reals)\n/*[ { re: 0.1, im: undefined },\n    { re: -0.2, im: undefined },\n    { re: 0.3, im: undefined },\n    { re: 0.45, im: undefined } ]*/\n\nmuxCmplx() //\n// [ { re: undefined, im: undefined } ]\n\nmuxCmplx(1) //\n// [ { re: 1, im: undefined } ]\n\n//3 specify real and imaginary\nmuxCmplx(1,-2)//\n//[ { re: 1, im: -2 } ]\n```\n\n\u003c/details\u003e\n\n### `numberPrecision`\n\nEnforces significant figure of a number, or on the properties of a JS object (deep search) with numeric values.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eExample\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_Example_:\n\n```javascript\nconst blas = require('blasjs');\n\nconst { helper: { numberPrecision } } = blas;\n\nconst _4 = numberPrecision(4);\n\n_4(0.123456789);\n//0.1235\n\n_4(123456789)\n//123500000\n\n//enforce significance over properties\n_4( { car: 'Mazda' , aux: { priceUSD: 24.3253E+3, maxWarpSpeed:3.42111E-4 } } );\n//{ car: 'Mazda', aux: { priceUSD: 24330, maxWarpSpeed: 0.0003421 } }\n\n_4([0.123456, 0.78901234]);\n//[ 0.1235, 0.789 ]\n```\n\n\u003c/details\u003e\n\n## Vector Constructors\n\nThese constructors create the `FortranArr` object for working with single/double precision complex/real Arrays.\n\n### `fortranArrComplex32`\n\nConstructs a [FortranArr](#fortranArr) object using [Float32Array][float32-array] as the underlying array(s) (plural in the case of complex) elements.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```typescript\ndeclare function fortranArrComplex32(\n    ...rest: (number | number[] | Complex | Complex[])[]\n    ): (offset = 1) =\u003e FortranArr;\n```\n\n`Argument list`:\n\n* `rest`: takes as input.\n    * A single numeric value.\n    * A single [`Complex`](#type-complex) object.\n    * An array of [`Complex`](#type-complex) objects.\n    * An array of number values.\n*  `offset`: the Fortran dimension offset (defaults to 1)\n\nSee _[Examples](#vector-creation-examples)_\n\n\u003c/details\u003e\n\n### `fortranArrComplex64`\n\nConstructs a [FortranArr](#fortranArr) object using [Float64Array][float64-array] as the underlying array(s) (plural in the case of complex) elements.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```typescript\ndeclare function fortranArrComplex64(\n    ...rest: (number | number[] | Complex | Complex[])[]\n    ): (offset = 1) =\u003e FortranArr;\n```\n\n`Argument list`:\n\n* `rest`: takes as input.\n    * A single numeric value.\n    * A single [`Complex`](#type-complex) object.\n    * An array of [`Complex`](#type-complex) objects.\n    * An array of number values.\n*  `offset`: the Fortran dimension offset (defaults to 1)\n\n\u003c/details\u003e\n\n#### Vector creation examples\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eExample\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```javascript\nconst blas = require('blasjs');\n\nconst { fortranArrComplex64, fortranArrComplex32 } = blas.helper;\n\nconst complexDataArr = [\n    { re: 1.8, im: -0.2 },\n    { re: 2.3, im: 0.6 }\n];\n\nconst realData = [ 0.1, 2, 0.34, .56 ];\n\nconst sp1 = fortranArrComplex32(complexDataArr)();\n//sp1.r = [ 1.7999999523162842, 2.299999952316284 ],\n//sp1.i = [ -0.20000000298023224, 0.6000000238418579 ],\n\nconst sp2 = fortranArrComplex32(realData)();\n//sp2.r =  [ 0.10000000149011612, 2, 0.3400000035762787, 0.5600000023841858 ]\n//sp2.i = undefined\n\nconst sp3 = fortranArrComplex32({re:0.2, im:-0.3})();\n//[ 0.20000000298023224 ]\n//[ -0.30000001192092896 ]\n\nconst sp4 = fortranArrComplex32(123)(4);\n/*{\n  base: 4,\n  r: Float32Array [ 123 ],\n  i: undefined,\n}*/\n\nconst sdp1 = fortranArrComplex64(complexDataArr)();\n//sp1.r = [ 1.8, 2.3 ],\n//sp1.i = [ -0.2, 0.6 ],\n\nconst sdp2 = fortranArrComplex64(realData)();\n//sp2.r =  [ 0.1, 2, 0.34, 0.56 ]\n//sp2.i = undefined\n\nconst sp3 = fortranArrComplex64({re:0.2, im:-0.3})();\n//[ 0.2 ]\n//[ -0.3 ]\n\nconst sp4 = fortranArrComplex64(123)(4);\n/*{\n  base: 4,\n  r: Float32Array [ 123 ],\n  i: undefined,\n}*/\n```\n\n\u003c/details\u003e\n\n## Matrix Constructors\n\nThese constructors create the [`Matrix`](#matrix) object for working with single/double precision complex/real Matrices.\n\n### `fortranMatrixComplex32`\n\nConstructs a [Matrix](#matrix) object using [Float32Array][float32-array] as the underlying array(s) (plural in the case of complex) elements.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```typescript\ndeclare function fortranMatrixComplex32(...rest: (Complex | Complex[])[]):\n    (nrRows: number, nrCols: number, rowBase?: number, colBase?: number) =\u003e Matrix\n```\n\n`Argument list`:\n\n* `rest`: takes as input.\n    * A single numeric value.\n    * A single [`Complex`](#type-complex) object.\n    * An array of [`Complex`](#type-complex) objects.\n    * An array of number values.\n* `nrRows`: where nrRows is equal to `n` in the matrix A(m,n).\n* `nrCols`: where nrCols is equal to `m` in the matrix A(m,n).\n* `rowBase`: FORTRAN offset for the first dimension (rows) as explained in [Language differences][language-differences].\n* `rowBase`: FORTRAN offset for the second dimension (columns) as explained in [Language differences][language-differences].\n\nSee _[Examples](#matrix-creation-examples)_\n\n\u003c/details\u003e\n\n### `fortranMatrixComplex64`\n\nConstructs a [Matrix](#matrix) object using [Float64Array][float64-array] as the underlying array(s) (plural in the case of complex) elements.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```typescript\ndeclare function fortranMatrixComplex64(...rest: (Complex | Complex[])[]):\n    (nrRows: number, nrCols: number, rowBase?: number, colBase?: number) =\u003e Matrix\n```\n\n`Argument list`:\n\n* `rest`: takes as input.\n    * A single numeric value.\n    * A single [`Complex`](#type-complex) object.\n    * An array of [`Complex`](#type-complex) objects.\n    * An array of number values.\n*  `nrRows`: where rnRows is equal to `n` in the matrix A(m,n).\n*  `nrCols`: where nrCols is equal to `m` in the matrix A(m,n).\n*  `rowBase`: FORTRAN offset for the first dimension (rows) as explained in [Language differences][language-differences].\n*  `rowBase`: FORTRAN offset for the second dimension (columns) as explained in [Language differences][language-differences].\n\n\u003c/details\u003e\n\n### Matrix Creation Examples\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```javascript\nconst blas = require('blasjs');\nconst {\n    fortranMatrixComplex64,\n    fortranMatrixComplex32\n} = blas.helper;\n\n// some matrix data 3x3 array  aka a_row_column\n\nconst a11 = { re: .2, im: -.11 };\nconst a21 = { re: .1, im: -.2 };\nconst a31 = { re: .3, im: .9 };\nconst a12 = { re: .4, im: .5 };\nconst a22 = { re: .9, im: -.34 };\nconst a32 = { re: -.2, im: .45 };\nconst a13 = { re: -.1, im: .89 };\nconst a23 = { re: .43, im: .23 };\nconst a33 = { re: .23, im: .56 };\n\nconst {\n    fortranMatrixComplex64,\n    fortranMatrixComplex32\n} = blas.helper;\n\n// Some matrix data 3x3 array  aka a_row_column\n\nconst a11 = { re: .2, im: -.11 };\nconst a21 = { re: .1, im: -.2 };\nconst a31 = { re: .3, im: .9 };\nconst a12 = { re: .4, im: .5 };\nconst a22 = { re: .9, im: -.34 };\nconst a32 = { re: -.2, im: .45 };\nconst a13 = { re: -.1, im: .89 };\nconst a23 = { re: .43, im: .23 };\nconst a33 = { re: .23, im: .56 };\n\n//functional curry to prepare for different mappings of A()\nconst A32 = fortranMatrixComplex64([\n    a11, a21, a31, a12, a22, a32, a13, a23, a33\n]);\n\n//matrix 1\nconst m1 = A32(3, 3); // 3x3 matrix with rowBase=1, colBase=1\n\n// mimic FORTRAN  \"COMPLEX*8  A(-2:1, -3:0)\"\nconst m2 = A32(3, 3, -2, -3);\n\n//same as FORTRAN default COMPLEX*8 A(3,3) !aka A(1:3,1:3)\nconst m3 = A32(3, 3, 1, 1)\n\n/* double precision */\n/* double precision */\n/* double precision */\n\nconst A64 = fortranMatrixComplex64([\n    a11, a21, a31, a12, a22, a32, a13, a23, a33\n]);\n\n// matrix 1 FORTRAN \"COMPLEX*16  A(-2:1, -3:0).\nconst m1 = A64(3, 3); // 3x3 matrix with rowBase=1, colBase=1\n\n// mimic FORTRAN  \"COMPLEX*16  A(-2:1, -3:0)\"\nconst m2 = A64(3, 3, -2, -3);\n\n// same as FORTRAN default COMPLEX*16 A(3,3) !aka A(1:3,1:3)\nconst m3 = A64(3, 3, 1, 1);\n```\n\n\u003c/details\u003e\n\n# A note on numeric precision\n\nIn `blasjs`, contrary to the FORTRAN reference implementation, the numeric precision of a routine, is not determined by its name but by [*how*](#vector-constructors) its arguments like [`FortranArr`](#fortranarr) and [`Matrix`](#matrix) are constructed before used as arguments in `blasjs` routines. The original FORTRAN names are kept for backwards compatibility to ease the porting of FORTRAN code toward `blasjs`.\n\n# Mimicking FORTRAN OUT Arguments\n\n\nIn FORTRAN a subroutine can have IN, OUT and IN/OUT scalar arguments. In JavaScript only arguments of type `object` are passed by reference. To mimic OUT and IN/OUT FORTRAN arguments, scalars are wrapped in a JS object. See [Construct a Givens plane rotation](#construct-a-givens-plane-rotation) for an example.\n\n\n# Level 1 routines\n\nRoutines categorized as _Level 1_ perform scalar-vector and vector-vector operations.\n\n## Euclidean norm: √(xᴴ·x)  or √(xᵀ·x)\n\nCalculates the norm of a (complex) vector.\n\nxᴴ is the _conjugate_ of x\n\nxᵀ is the _transpose_ of x\n\n### scrnm2/dznrm2, snrm2/dnrm2\n\n* `scrnm2`: complex, [single or double precision][precision-note]. See [blas ref][ref-scnrm2].\n* `dznrm2`: complex, (alias for `scrnm2`). See [blas ref][ref-dznrm2].\n* `snrm2`: real, [single or double precision][precision-note]. See [blas ref][ref-snrm2].\n* `dnrm2`: real, (alias for `dnrm2`). See [blas ref][ref-dnrm2].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction scnrm2(n: number, x: FortranArr, incx: number): number;\nfunction dznrm2(n: number, x: FortranArr, incx: number): number;\nfunction snrm2(n: number, x: FortranArr, incx: number): number;\nfunction dnrm2(n: number, x: FortranArr, incx: number): number;\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { scnrm2, dznrm2, snrm2, dnrm2 } = BLAS.level1;\n```\n\n\u003c/details\u003e\n\n## Construct a Givens plane rotation\n\nSee [wiki][givens-rotation].\n\n```math\n |c  -s| × |a| =   |r |\n |s   c|   |b|     |0 |\n\n r =  √( a² + b² )\n```\n\n### srotg/drotg, crotg/zrotg\n\n* `srotg`: real, (alias for `drotg`). See [blas ref][ref-srotg].\n* `drotg`: real, [single or double precision][precision-note]. See [blas ref][ref-drotg].\n* `crotg`: complex, [single or double precision][precision-note]. See [blas ref][ref-crotg].\n* `zrotg`: complex, (alias for `crotg`). See [blas ref][ref-zrotg].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction srotg(p: { sa: number, sb: number, c: number, s: number } ): void;\nfunction drotg(p: { sa: number, sb: number, c: number, s: number } ): void;\nfunction crotg(ca: Complex, cb: Complex, c: { val: number }, s: Complex ): void\nfunction zrotg(ca: Complex, cb: Complex, c: { val: number }, s: Complex ): void\n```\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { srotg, drotg, crotg, zrotg } = BLAS.level1;\n```\n\n\u003c/details\u003e\n\n## Construct the **modified** Givens rotation matrix `H`\n\nConstruct the modified Givens transformation matrix H which zeros\nthe second component of the 2 vector  ( sx1*√(sd1) , sy1* √(sd2) )\nSee [researchgate.net][construct-modified-givens-transformation].\n\n### srotmg/drotmg\n\n* `srotmg`: real, (alias for `drotmg`). See [blas ref][ref-srotmg].\n* `drotmg`: real, [single or double precision][precision-note]. See [blas ref][ref-drotmg].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction srotmg(p: { sd1: number, sd2: number, sx1: number, sy1: number, sparam: FortranArr }): void;\nfunction drotmg(p: { sd1: number, sd2: number, sx1: number, sy1: number, sparam: FortranArr }): void;\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { srotmg, drotmg } = BLAS.level1;\n```\n\n\u003c/details\u003e\n\n## Apply the modified Givens Transformation\n\nSee [wiki][apply-modified-givens-transformation].\n\n### srotm/drotm\n\n* `srotm`: real, (alias for `drotm`). See [blas ref][ref-srotm].\n* `drotm`: real, [single or double precision][precision-note]. See [blas ref][ref-drotm].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction srotm(n: number, sy: FortranArr, incx: number, sy: FortranArr, incy: number, sparam: FortranArr)): void;\n\nfunction drotm(n: number, sy: FortranArr, incx: number, sy: FortranArr, incy: number, sparam: FortranArr)): void;\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { srotm, drotm } = BLAS.level1;\n```\n\n\u003c/details\u003e\n\n## Applies a plane rotation\n\nSee [researchgate.net][construct-modified-givens-transformation].\n\n### srot/drot, csrot/zdrot\n\n* `srot`: real, (alias for `drot`). See [blas ref][ref-srot].\n* `drot`: real, [single or double precision][precision-note]. See [blas ref][ref-drot].\n* `csrot`: complex, (alias for `zdrot`). See [blas ref][ref-csrot].\n* `zdrot`: complex, [single or double precision][precision-note]. See [blas ref][ref-zdrot].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction srot(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number, c: number, s: number): void;\nfunction drot(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number, c: number, s: number): void;\n\nfunction csrot: (n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number, c: number, s: number): void;\nfunction zdrot: (n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number, c: number, s: number): void;\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { srot, drot, csrot, zdrot } = BLAS.level1;\n```\n\n\u003c/details\u003e\n\n## Scale a vector by a constant\n\nx ⟵ α·x\n\n### sscal/dscal, cscal/zscal, csscal/zdscal\n\n* `sscal`: Alias for `dscal`. See [blas ref][ref-sscal].\n* `dscal`:  by a REAL constant. See [blas ref][ref-dscal].\n* `cscal`: Alias for `zscal`. See [blas ref][ref-cscal].\n* `zscal`: Scales a COMPLEX vector with a COMPLEX constant. See [blas ref][ref-zscal].\n* `csscal`: Alias for `zdscal`. [blas ref][ref-csscal].\n* `zdscal`: Scales a COMPLEX vector with a REAL constant. See [blas ref][ref-zdscal].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction sscal(n: number, sa: number, sx: FortranArr, incx: number): void;\nfunction dscal(n: number, sa: number, sx: FortranArr, incx: number): void;\nfunction cscal(n: number, ca: Complex,cx: FortranArr, incx: number): void;\nfunction zscal(n: number, ca: Complex,cx: FortranArr, incx: number): void;\nfunction csscal(n: number, sa: number, cx: FortranArr, incx: number): void;\nfunction zdscal(n: number, sa: number, cx: FortranArr, incx: number): void;\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { sscal, dscal, cscal, zscal, csscal, zdscal } = BLAS.level1;\n```\n\n\u003c/details\u003e\n\n## Takes the sum of the absolute values of the components of vector\n\ns ⟵ ∑ ∥ Re( x ) ∥ + ∥ Im( x ) ∥\n\n### sasum/dasum, scasum/dzasum\n\n* `sasum`: Alias for `dasum`. See [blas ref][ref-sasum]\n* `dasum`: uses REAL vector, ( [single or double precision][precision-note] ). See [blas-ref][ref-dasum].\n* `scasum`: Alias for `dzasum`. See [blas ref][ref-scasum].\n* `dzasum`: uses Complex vector, ( [single or double precision][precision-note] ). See [blas-ref][ref-dzasum].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction sasum(n: number, sx: FortranArr, incx: number): number;\nfunction dasum(n: number, sx: FortranArr, incx: number): number;\nfunction scasum(n: number, cx: FortranArr, incx: number): number;\nfunction dzasum(n: number, cx: FortranArr, incx: number): number;\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { sasum, dasum, scasum, dzasum } = BLAS.level1;\n```\n\n\u003c/details\u003e\n\n## Interchanges 2 vectors\n\nSwap 2 vectors.\n\n### sswap/dswap, cswap/zswap\n\n* `sswap`: Alias for `dswap`. See [blas ref][ref-sswap].\n* `dswap`: REAL vector, ( [single or double precision][precision-note] ). See [blas ref][ref-dasum].\n* `cswap`: Alias for `zswap`. See [blas ref][ref-xcswap].  \n* `zswap`: REAL vector, ( [single or double precision][precision-note] ). See [blas ref][ref-zswap].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```javascript\nfunction sswap(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number ): void;\nfunction dswap(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number ): void;\nfunction cswap(n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number ): void;\nfunction zswap(n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number ): void;\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { sswap, dswap, cswap, zswap } = BLAS.level1;\n```\n\n\u003c/details\u003e\n\n## Dot product of two complex vectors\n\n  xᵀ·y or xᴴ·y\n\n### cdotu/cdotc, zdotu/zdotc\n\n* `cdotu`: Alias for `zdotu`. See [blas ref][ref-zdotc].\n* `cdotc`: Alias for `zdotc`. See [blas ref][ref-cdotc].\n* `zdotu`: `xᵀ·y`. Complex arguments, ( [single or double precision][precision-note] ). See [blas-ref][ref-zdotu].\n* `zdotc`: `xᴴ·y`. The fist complex vector argument is made conjugate, ( [single or double precision][precision-note] ). See [blas-ref][ref-zdotc].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```javascript\nfunction cdotu(n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number): Complex;\n\n// first argument sx is made conjugate\nfunction cdotc(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number ): Complex;\n\nfunction zdotu(n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number ): Complex;\n\n// first argument sx is made conjugate\nfunction zdotc(n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number ): Complex;\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { cdotu, cdotc, zdotu, zdotc } = BLAS.level1;\n```\n\n\u003c/details\u003e\n\n## Dot product of two non complex vectors\n  \nxᵀ·y\n\n### sdot/ddot, sdsdot/dsdot\n\n* `sdot`: Alias for `dsdot`. See [blas ref][ref-sdot].\n* `ddot`: Alias for `dsdot`. See [blas ref][ref-ddot].\n* `sdsdot`: Alias for `dsdot`. See [blas ref][ref-sdsdot].\n* `dsdot`: `xᵀ·y` Inner product of 2 vectors ( [single or double precision][precision-note] ). See [blas ref][ref-dsdot].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```javascript\nfunction sdot(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number): number;\nfunction ddot(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number): number;\nfunction sdsdot(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number): number;\nfunction dsdot(n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number): number;\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { sdot, ddot, sdsdot, dsdot } = BLAS.level1;\n```\n\n\u003c/details\u003e\n\n## Finds the index of the first element having maximum absolut value.\n\nFind k for wich: ∥ xₖ ∥ \u003e ∥ xₜ ∥ for all t ∈ [1, n].\n\n### isamax/idamax, icamax/izamax\n\n* `isamax`: Alias for `idamax`. See [blas ref]:[ref-isamax]\n* `idamax`: Find the index of the maximum element of a REAL vector ( [single or double precision][precision-note] ). See [blas ref][ref-idamax]. \n* `icamax`: Alias for `izamax`. See [blas ref]:[ref-icamax]\n* `izamax`: Find the index of the maximum element of a COMPLEX vector ( [single or double precision][precision-note] ). See [blas ref][ref-izamax].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```javascript\nfunction isamax: (n: number, sx: FortranArr, incx: number): number;\nfunction idamax: (n: number, sx: FortranArr, incx: number): number;\nfunction icamax: (n: number, sx: FortranArr, incx: number): number;\nfunction izamax: (n: number, sx: FortranArr, incx: number): number;\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { isamax, idamax, icamax, izamax } = BLAS.level1;\n```\n\n\u003c/details\u003e\n\n## Copy a vector x to a vector y\n\n### scopy/dcopy, ccopy/zcopy\n\n* `scopy`: Alias for `dcopy`. See [blas ref]:[ref-scopy]\n* `dcopy`: Copies a REAL vector ( [single or double precision][precision-note] ). See [blas ref][ref-dcopy].\n* `ccopy`: Alias for `zcopy`. See [blas ref]:[ref-ccopy]\n* `zcopy`: Copies a COMPLEX vector ( [single or double precision][precision-note] ). See [blas ref][ref-zcopy].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```javascript\nfunction scopy (n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number): void;\nfunction dcopy (n: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number): void;\nfunction ccopy (n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number): void;\nfunction zcopy (n: number, cx: FortranArr, incx: number, cy: FortranArr, incy: number): void;\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { scopy, dcopy, ccopy, zcopy } = BLAS.level1;\n```\n\n\u003c/details\u003e\n\n## Constant times a vector plus a vector\n\ny ⟵ y + a·x  where y, a and x can be complex or a real number.\n\n### saxpy/daxpy, caxpy/zaxpy\n\n* `saxpy`: Alias for `daxpy`. See [blas ref]:[ref-saxpy].\n* `daxpy`: REAL constant used in multiplication with a vector ( [single or double precision][precision-note] ). See [blas ref]:[ref-daxpy].   \n* `caxpy`: Alias for `zaxpy`. See [blas ref]:[ref-saxpy].\n* `zaxpy`: Complex constant used in multiplication with a vector ( [single or double precision][precision-note] ). See [blas ref]:[ref-zaxpy].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```javascript\nfunction saxpy(n: number, sa: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number): void;\nfunction daxpy(n: number, sa: number, sx: FortranArr, incx: number, sy: FortranArr, incy: number): void;\nfunction caxpy(n: number, ca: Complex, cx: FortranArr, incx: number, cy: FortranArr, incy: number): void;\nfunction zaxpy(n: number, ca: Complex, cx: FortranArr, incx: number, cy: FortranArr, incy: number): void;\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { saxpy, daxpy, caxpy, zaxpy } = BLAS.level1;\n```\n\n\u003c/details\u003e\n\n# Level 2 Routines\n\nRoutines categorized as _Level 2_ perform Matrix-vector operations.\n\n## The hermitian rank 2 operation A ⟵ α·x·yᴴ + conjg( α )·y·xᴴ + A  \n\n( ᴴ means conjugate transpose )\n\nFor the routines `chpr2` and `zhpr2` the matrix A is in packed form ( a [fortranArr](#vector-constructors) ).\n\nFor the routines `cher2` and `zher2` the matrix symmetry is exploited (use only upper/lower triangular part of the matrix). \n\n### cher2/zher2, chpr2|zhpr2\n\n* `cher2`: alias for `zher2`. See [blas ref][ref-cher2].\n* `zher2`: The Matrix `A` is in upper or lower triangular form ( [single or double precision][precision-note] ). See [blas ref][ref-zher2].  \n* `chpr2`: alias for `zhpr2`. See [blas ref][ref-chpr2].\n* `zhpr2`: The matrix `A` is in [packed](#packed-matrices) form ( [single or double precision][precision-note] ). See [blas ref][ref-zhpr2].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction cher2|zher2(\n     uplo: \"u\" | \"l\", \n     n: number, \n     alpha: Complex, \n     x: FortranArr, \n     incx: number, \n     y: FortranArr, \n     incy: number, \n     a: Matrix, \n     lda: number): void;\n\nfunction chpr2|zhpr2(\n     uplo: \"u\" | \"l\", \n     n: number, \n     alpha: Complex, \n     x: FortranArr, \n     incx: number, \n     y: FortranArr, \n     incy: number, \n     ap: FortranArr): void;\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nSee: _[how to create Matrix](#matrix-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { cher2, zher2, chpr, zhpr } = BLAS.level2;\n```\n\n\u003c/details\u003e\n\n## The symmetric rank 2 operation A ⟵ α·x·yᵀ + α·y·xᵀ + A\n\nFor the routines `sspr2` and `dspr2` the matrix A is in [packed](#packed-matrices) form ( a [fortranArr](#vector-constructors) ).\n\nFor the routines `ssyr2` and `dsyr2` the matrix symmetry is exploited (use only upper/lower triangular part of the matrix). \n\n### sspr2/dspr2, ssyr2/dsyr2\n\n* `sspr2`: Alias for dspr2. See [blas ref][ref-sspr2].\n* `dspr2`: The matrix `A` is in [packed](#packed-matrices) form ( [single or double precision][precision-note] ). See [blas ref][ref-dspr2].\n* `ssyr2`: Alias for dsyr2. See [blas ref][ref-ssyr2].\n* `dsyr2`: The Matrix `A` is in upper or lower triangular form ( [single or double precision][precision-note] ). See [blas ref][ref-dsyr2].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n _decl_\n\n```typescript\nfunction sspr2|dspr2(\n    uplo: \"u\" | \"l\", \n    n: number, \n    alpha: number, \n    x: FortranArr, \n    incx: number, \n    y: FortranArr, \n    incy: number, \n    ap: FortranArr):void;\n\nfunction ssyr2|dsyr2(\n    uplo: 'u' | 'l', \n    n: number, \n    alpha: number, \n    x: FortranArr, \n    incx: number, \n    y: FortranArr, \n    incy: number, \n    A: Matrix, \n    lda: number): void;\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nSee: _[how to create Matrix](#matrix-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { sspr2, dspr2, ssyr2, dsyr2 } = BLAS.level2;\n```\n\n\u003c/details\u003e\n\n## The rank 1 operation A ⟵ α·x·yᴴ + A or A ⟵ α·x·yᵀ + A\n\n( ᴴ means conjugate transpose )\n\nThe subroutines `sger` and `dger` perform  A ⟵ α·x·yᵀ + A. Where α is a REAL scalar,\n A, x, y are [single or double precision][precision-note] REAL Matrix and vectors.\n\nThe subroutines `cgerc` and `zgerc` perform  A ⟵ α·x·yᴴ + A. Where α is a COMPLEX scalar,\n A, x, y are [single or double precision][precision-note] COMPLEX Matrix and vectors.\n\nThe subroutines `cgeru` and `zgeru` perform  A ⟵ α·x·yᵀ + A. Where α is a COMPLEX scalar,\n A, x, y are [single or double precision][precision-note] COMPLEX Matrix and vectors.  \n\n### sger/dger, cgerc/zgerc, cgeru/zgeru\n\n* `sger`: alias for `dger`. See [blas ref][ref-sger].\n* `dger`: See [blas ref][ref-dger].\n* `cgerc`: alias for `zgerc`. See [blas ref][ref-cgerc].\n* `zgerc`: See [blas ref][ref-zgerc].\n* `cgeru`: alias for `zgeru`. See [blas ref][ref-cgeru].\n* `zgeru`: See [blas ref][ref-zgeru].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction sger|dger(\n    m: number, \n    n: number, \n    alpha: number, \n    x: FortranArr, \n    incx: number, \n    y: FortranArr, \n    incy: number, \n    a: Matrix, \n    lda: number):void;\n\nfunction cgerc|zgerc(\n    m: number, \n    n: number, \n    alpha: Complex, \n    x: FortranArr, \n    incx: number, \n    y: FortranArr, \n    incy: number, \n    a: Matrix, \n    lda: number): void;\n\nfunction cgeru|zgeru(\n    m: number, \n    n: number, \n    alpha: Complex, \n    x: FortranArr, \n    incx: number, \n    y: FortranArr, \n    incy: number, \n    a: Matrix, \n    lda: number): void;\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nSee: _[how to create Matrix](#matrix-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { sger, dger, cgerc, zgerc, cgeru, zgeru } = BLAS.level2;\n```\n\n\u003c/details\u003e\n\n## The hermitian rank 1 operation A ⟵ α·x·xᴴ + A\n\n( ᴴ means conjugate transpose )\n\nFor the routines `cher` and `zher` α is a REAL scalar, the matrix symmetry of A is exploited (use only upper/lower triangular part of the matrix).\n\nFor the routines `chpr` and `zhpr` α is a REAL scalar, the matrix A is in [packed](#packed-matrices) form ( a [fortranArr](#vector-constructors) ).\n\n### Naming\n\n* `cher`: alias for `zher`. See [blas ref][ref-cher].\n* `zher`: For [single or double precision][precision-note] complex `x` and `A`. See [blas ref][ref-cher].\n* `chpr`: alias for `zher`. See [blas ref][ref-cher].\n* `zhpr`: For [single or double precision][precision-note] complex `x` and `A`. See [blas ref][ref-cher].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n```typescript\nfunction cher(\n    uplo: \"u\" | \"l\", \n    n: number, \n    alpha: number, \n    x: FortranArr, \n    incx: number, \n    a: Matrix, \n    lda: number): void;\n\nfunction zher(\n    uplo: \"u\" | \"l\", \n    n: number, \n    alpha: number, \n    x: FortranArr, \n    incx: number, \n    a: Matrix, \n    lda: number): void;\n\nfunction chpr(u\n    uplo: \"u\" | \"l\", \n    n: number, \n    alpha: number, \n    x: FortranArr, \n    incx: number, \n    ap: FortranArr): void;\n\nfunction zhpr(\n    uplo: \"u\" | \"l\", \n    n: number, \n    alpha: number, \n    x: FortranArr, \n    incx: number, \n    ap: FortranArr): void;\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nSee: _[how to create Matrix](#matrix-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { cher, zher, chpr, zhpr } = BLAS.level2;\n```\n\n\u003c/details\u003e\n\n## The symmetric rank 1 operation A ⟵ α·x·xᵀ + A\n\nFor the routines `ssyr` and `dsyr` α is a REAL scalar, the symmetry of the REAL matrix A is exploited (use only upper/lower triangular part of the matrix).\n\nFor the routines `sspr` and `dspr` α is a REAL scalar, the REAL matrix A is in [packed](#packed-matrices) form ( a [fortranArr](#vector-constructors) ).\n\n### sspr/dspr, ssyr/dsyr\n\n* `sspr`: alias for `dspr`. See [blas ref][ref-sspr].\n* `dspr`: For [single or double precision][precision-note] REAL `α` , `x` and `A`. See [blas ref][ref-dspr].\n* `ssyr`: alias for `ssyr`. See [blas ref][ref-ssyr].\n* `dsyr`: For [single or double precision][precision-note] REAL `α` , `x` and `A`. See [blas ref][ref-dsyr].\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction sspr(\n   uplo: \"u\" | \"l\", \n   n: number, \n   alpha: number, \n   x: FortranArr, \n   incx: number, \n   ap: FortranArr): void;\n\nfunction dspr(\n   uplo: \"u\" | \"l\", \n   n: number, \n   alpha: number, \n   x: FortranArr, \n   incx: number, \n   ap: FortranArr): void;\n\nfunction ssyr(\n    uplo: \"u\" | \"l\", \n    n: number, \n    alpha: number, \n    x: FortranArr, \n    incx: number, \n    a: Matrix, \n    lda: number): void;\n\nfunction dsyr(\n    uplo: \"u\" | \"l\", \n    n: number, \n    alpha: number, \n    x: FortranArr, \n    incx: number, \n    a: Matrix, \n    lda: number): void;    \n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nSee: _[how to create Matrix](#matrix-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { sspr, dspr, ssyr, dsyr } = BLAS.level2;\n```\n\n\u003c/details\u003e\n\n## The matrix-vector operation, y ⟵ α·A·x + β·y, or y ⟵ α·Aᵀ·x + β·y or y ⟵  α·Aᴴ·x + β·y\n\nAᴴ is the complex conjugate transpose of matrix A\n\nThe naming in blasjs does not reflect the precision used, precision is determined by [argument construction][precision-note]. The naming is maintained for compatibility with the reference implementation. \n\n### cgbmv/zgbmv, chbmv/zhbmv, ssbmv/dsbmv, sgbmv/dgbmv, stbmv/dtbmv, chemv/zhemv, sgemv/dgemv, cgemv/zgemv, chpmv/zhpmv, sspmv/dspmv, ssymv/dsymv\n\n| subroutine  | operation                                              | complex | real    | type of matrix A              | blas ref link                         |\n| ----------- | ------------------------------------------------------ | ------- | ------- | ----------------------------- | ------------------------------------- |\n| cgbmv/zgbmv | y ⟵ α·A·x + β·y , y ⟵ α·Aᵀ·x + β·y, y ⟵  α·Aᴴ·x + β·y  | α, A, β | none    | upper/lower band              | [cgbmv][ref-cgbmv]/[zgbmv][ref-zgbmv] |\n| chbmv/zhbmv | y ⟵ α·A·x + β·y                                        | α, A, β | none    | upper/lower band              | [chbmv][ref-chbmv]/[zhbmv][ref-zhbmv] |  |\n| ssbmv/dsbmv | y ⟵ α·A·x + β·y                                        | none    | α, A, β | upper/lower band              | [chbmv][ref-chbmv]/[zhbmv][ref-zhbmv] |\n| sgbmv/dgbmv | y ⟵ α·A·x + β·y , y ⟵ α·Aᵀ·x + β·y                     | none    | α, A, β | upper/lower band              | [sgbmv][ref-sgbmv]/[dgbmv][ref-dgbmv] |\n| stbmv/dtbmv | y ⟵ α·A·x + β·y                                        | none    | α, A, β | upper/lower band              | [stbmv][ref-stbmv]/[dtbmv][ref-dtbmv] |\n| chemv/zhemv | y ⟵ α·A·x + β·y                                        | α, A, β | none    | triangular upper/lower        | [chemv][ref-chemv]/[zhemv][ref-zhemv] |  |\n| sgemv/dgemv | y ⟵ α·A·x + β·y , y ⟵ α·Aᵀ·x + β·y                     | none    | α, A, β | full m x n                    | [sgemv][ref-sgemv]/[dgemv][ref-dgemv] |  |\n| cgemv/zgemv | y ⟵ α·A·x + β·y , y ⟵ α·Aᵀ·x + β·y,  y ⟵  α·Aᴴ·x + β·y | α, A, β | none    | full m x n                    | [cgemv][ref-cgemv]/[zgemv][ref-zgemv] |\n| chpmv/zhpmv | y ⟵ α·A·x + β·y                                        | α, A, β | none    | packed upper/lower triangular | [cgemv][ref-cgemv]/[zgemv][ref-zgemv] |\n| sspmv/dspmv | y ⟵ α·A·x + β·y                                        | none    | α, A, β | packed upper/lower triangular | [sspmv][ref-sspmv]/[dspmv][ref-dspmv] |\n| ssymv/dsymv | y ⟵ α·A·x + β·y                                        | α, A, β | none    | upper/lower triangular        | [ssymv][ref-ssymv]/[dsymv][ref-dsymv] |\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\n\nfunction cgbmv|zgbmv(\n    trans: 'n' | 't' | 'c',\n    m: number,\n    n: number,\n    kl: number,\n    ku: number,\n    alpha: Complex,\n    a: Matrix,\n    lda: number,\n    x: FortranArr,\n    incx: number,\n    beta: Complex,\n    y: FortranArr,\n    incy: number\n): void;\n\nfunction chbmv|zhbmv(\n    uplo: 'u' | 'l',\n    n: number,\n    k: number,\n    alpha: Complex,\n    a: Matrix,\n    lda: number,\n    x: FortranArr,\n    incx: number,\n    beta: Complex,\n    y: FortranArr,\n    incy: number\n): void;\n\nexport function ssbmv|dsbmv(\n    uplo: string,\n    n: number,\n    k: number,\n    alpha: number,\n    a: Matrix,\n    lda: number,\n    x: FortranArr,\n    incx: number,\n    beta: number,\n    y: FortranArr,\n    incy: number\n): void;\n\nfunction sgbmv|dgbmv(\n    trans: string,\n    m: number,\n    n: number,\n    kl: number,\n    ku: number,\n    alpha: number,\n    a: Matrix,\n    lda: number,\n    x: FortranArr,\n    incx: number,\n    beta: number,\n    y: FortranArr,\n    incy: number\n): void;\n\nfunction stbmv | dtbmv(\n    uplo: 'u' | 'l',\n    trans: 'n' | 't' | 'c',\n    diag: 'u' | 'n',\n    n: number,\n    k: number,\n    A: Matrix,\n    lda: number,\n    x: FortranArr,\n    incx: number\n): void; \n\nfunction chemv|zhemv(\n    uplo: 'u' | 'l',\n    n: number,\n    alpha: Complex,\n    a: Matrix,\n    lda: number,\n    x: FortranArr,\n    incx: number,\n    beta: Complex,\n    y: FortranArr,\n    incy: number\n): void \n\nfunction sgemv|dgemv(\n    trans: string,\n    m: number,\n    n: number,\n    alpha: number,\n    a: Matrix,\n    lda: number,\n    x: FortranArr,\n    incx: number,\n    beta: number,\n    y: FortranArr,\n    incy: number\n): void;\n\nfunction cgemv|zgemv(\n    trans: 'n' | 't' | 'c',\n    m: number,\n    n: number,\n    alpha: Complex,\n    a: Matrix,\n    lda: number,\n    x: FortranArr,\n    incx: number,\n    beta: Complex,\n    y: FortranArr,\n    incy: number\n): void;\n\nfunction chpmv|zhpmv(\n    uplo: 'u' | 'l',\n    n: number,\n    alpha: Complex,\n    ap: FortranArr,\n    x: FortranArr,\n    incx: number,\n    beta: Complex,\n    y: FortranArr,\n    incy: number\n): void;\n\nfunction sspmv|dspmv(\n    uplo: 'u' | 'l',\n    n: number,\n    alpha: number,\n    ap: FortranArr, // a symmetric matrix in packed form\n    x: FortranArr,\n    incx: number,\n    beta: number,\n    y: FortranArr,\n    incy: number\n): void\n\nfunction ssymv|dsymv(\n    uplo: 'u' | 'l',\n    n: number,\n    alpha: number,\n    a: Matrix,\n    lda: number,\n    x: FortranArr,\n    incx: number,\n    beta: number,\n    y: FortranArr,\n    incy: number\n): void\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nSee: _[how to create Matrix](#matrix-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\n\nconst { \n cgbmv, chbmv, dgbmv, dsbmv, sgbmv, ssbmv, zgbmv, zhbmv,\n cgemv, chemv, dgemv, sgemv, zgemv, zhemv,\n chpmv, dspmv, sspmv, zhpmv, dsymv, ssymv } = BLAS.level2;\n```\n\n\u003c/details\u003e\n\n## The matrix-vector operation, x ⟵ A·x, or x ⟵ Aᵀ·x, or x ⟵ Aᴴ·x\n\nAᴴ is the complex conjugate transpose of matrix A\n\nThe naming in blasjs does not reflect the precision used, precision is determined by [argument construction][precision-note]. The naming is maintained for compatibility with the reference implementation.\n\n### stbmv, dtbmv, ctbmv, dtpmv, ctpmv, ztpmv, strmv, dtrmv, ctrmv, ztrmv  \n\n| subroutine  | operation                         | complex | real | type of matrix A              | blas ref link                         |\n| ----------- | --------------------------------- | ------- | ---- | ----------------------------- | ------------------------------------- |\n| stbmv/dtbmv | x ⟵ A·x, or x ⟵ Aᵀ·x              | none    | A, x | upper/lower band              | [stbmv][ref-stbmv]/[dtbmv][ref-dtbmv] |\n| ctbmv/ztbmv | x ⟵ A·x, or x ⟵ Aᵀ·x, or x ⟵ Aᴴ·x | A, x    | none | upper/lower band              | [ctbmv][ref-ctbmv]/[ztbmv][ref-ztbmv] |\n| stpmv/dtpmv | x ⟵ A·x, or x ⟵ Aᵀ·x              | none    | A, x | upper/lower triangular packed | [stpmv][ref-stpmv]/[dtpmv][ref-dtpmv] |\n| ctpmv/ztpmv | x ⟵ A·x, or x ⟵ Aᵀ·x, or x ⟵ Aᴴ·x | A, x    | none | upper/lower triangular packed | [ctpmv][ref-ctpmv]/[ztpmv][ref-ztpmv] |\n| strmv/dtrmv | x ⟵ A·x, or x ⟵ Aᵀ·x              | none    | A, x | upper/lower triangular        | [strmv][ref-strmv]/[dtrmv][ref-dtrmv] |\n| ctrmv/ztrmv | x ⟵ A·x, or x ⟵ Aᵀ·x, or x ⟵ Aᴴ·x | A, x    | none | upper/lower triangular        | [ctrmv][ref-ctrmv]/[ztrmv][ref-ztrmv] |\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction stbmv|dtbmv(\n    uplo: 'u' | 'l',\n    trans: 'n' | 't' | 'c',\n    diag: 'u' | 'n',\n    n: number,\n    k: number,\n    A: Matrix,\n    lda: number,\n    x: FortranArr,\n    incx: number\n): void;\n\nfunction ctbmv|ztbmv(\n    uplo: 'u' | 'l',\n    trans: 'n' | 't' | 'c',\n    diag: 'u' | 'n',\n    n: number,\n    k: number,\n    a: Matrix,\n    lda: number,\n    x: FortranArr,\n    incx: number\n): void;\n\nfunction stpmv|zhbmv (\n    uplo: 'u' | 'l',\n    trans: 'n' | 't' | 'c',\n    diag: 'u' | 'n',\n    n: number,\n    ap: FortranArr,\n    x: FortranArr,\n    incx: number\n): void; \n\nfunction ctpmv|ztpmv(\n    uplo: 'u' | 'l',\n    trans: 'n' | 't' | 'c',\n    diag: 'u' | 'n',\n    n: number,\n    ap: FortranArr,\n    x: FortranArr,\n    incx: number\n): void;\n\nfunction strmv|dtrmv(\n    uplo: 'u' | 'l',\n    trans: 't' | 'c' | 'n',\n    diag: 'u' | 'n',\n    n: number,\n    a: Matrix,\n    lda: number,\n    x: FortranArr,\n    incx: number\n): void;\n\nfunction ctrmv|ztrmv(\n    uplo: 'u' | 'l',\n    trans: 'n' | 't' | 'c',\n    diag: 'u' | 'n',\n    n: number,\n    a: Matrix,\n    lda: number,\n    x: FortranArr,\n    incx: number\n): void;\n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nSee: _[how to create Matrix](#matrix-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\n\nconst { \n stbmv, dtbmv, ctbmv, ztbmv, stpmv, dtpmv, ctpmv, ztpmv, strmv\n dtrmv, ctrmv, ztrmv } = BLAS.level2;\n```\n\n\u003c/details\u003e\n\n## Solves a systems of equations A·x = b, or Aᵀ·x = b, or Aᴴ·x = b\n\nAᴴ is the complex conjugate transpose of matrix A\n\n### stbsv, dtbsv, ctbsv, ztbsv, stpsv, dtpsv, ctpsv, ztpsv, ctrsv, ztrsv, strs, dtrsv\n\nThe naming in blasjs does not reflect the precision used, precision is determined by [argument construction][precision-note]. The naming is maintained for compatibility with the reference implementation.\n\n| subroutine  | operation                         | complex | real    | type of matrix A              | blas ref link                         |\n| ----------- | --------------------------------- | ------- | ------- | ----------------------------- | ------------------------------------- |\n| stbsv/dtbsv | A·x = b, or Aᵀ·x = b              | none    | A, b, x | upper/lower band              | [stbsv][ref-stbsv]/[dtbsv][ref-dtbsv] |\n| ctbsv/ztbsv | A·x = b, or Aᵀ·x = b, or Aᴴ·x = b | A, b, x | none    | upper/lower band              | [ctbsv][ref-ctbsv]/[ztbsv][ref-ztbsv] |\n| stpsv/dtpsv | A·x = b, or Aᵀ·x = b              | none    | A, b, x | packed upper/lower triangular | [stpsv][ref-stpsv]/[dtpsv][ref-dtpsv] |\n| ctpsv/ztpsv | A·x = b, or Aᵀ·x = b, or Aᴴ·x = b | A, b, x | none    | packed upper/lower triangular | [ctpsv][ref-ctpsv]/[ztpsv][ref-ztpsv] |\n| ctrsv/ztrsv | A·x = b, or Aᵀ·x = b, or Aᴴ·x = b | A, b, x | none    | upper/lower triangular        | [ctrsv][ref-ctrsv]/[ztrsv][ref-ztrsv] |\n| strsv/dtrsv | A·x = b, or Aᵀ·x = b              | none    | A, b, x | upper/lower triangular        | [strsv][ref-strsv]/[dtrsv][ref-dtrsv] |\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\n\nfunction stbsv|dtbsv(\n    uplo: 'u' | 'l',\n    trans: 't' | 'n' | 'c',\n    diag: 'u' | 'n',\n    n: number,\n    k: number,\n    A: Matrix,\n    lda: number,\n    x: FortranArr,\n    incx: number\n): void;\n\nfunction ctbsv|ztbsv(\n    uplo: 'u' | 'l',\n    trans: 'n' | 't' | 'c',\n    diag: 'u' | 'n',\n    n: number,\n    k: number,\n    a: Matrix,\n    lda: number,\n    x: FortranArr,\n    incx: number\n): void;\n \nfunction stpsv|dtpsv(\n    uplo: 'u' | 'l',\n    trans: 't' | 'n' | 'c',\n    diag: 'u' | 'n',\n    n: number,\n    ap: FortranArr,\n    x: FortranArr,\n    incx: number\n): void;\n\nfunction ctpsv|ztpsv(\n    uplo: 'u' | 'l',\n    trans: 'n' | 't' | 'c',\n    diag: 'u' | 'n',\n    n: number,\n    ap: FortranArr,\n    x: FortranArr,\n    incx: number\n): void \n\nfunction ctrsv|ztrsv(\n    uplo: 'u' | 'l',\n    trans: 'n' | 't' | 'c',\n    diag: 'u' | 'n',\n    n: number,\n    a: Matrix,\n    lda: number,\n    x: FortranArr,\n    incx: number\n): void \n\nfunction strsv|dtrsv(\n    uplo: 'u' | 'l',\n    trans: 't' | 'c' | 'n',\n    diag: 'u' | 'n',\n    n: number,\n    a: Matrix,\n    lda: number,\n    x: FortranArr,\n    incx: number\n): void \n```\n\nSee: _[how to create fortranArr](#vector-constructors)_.\n\nSee: _[how to create Matrix](#matrix-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\n\nconst { \n    stbsv, dtbsv, ctbsv, ztbsv, stpsv, \n    dtpsv, ctpsv, ztpsv, ctrsv, ztrsv, \n    strsv, dtrsv } = BLAS.level2;\n```\n\n\u003c/details\u003e\n\n# Level 3 Routines\n\nRoutines categorized as _Level 2_ perform Matrix-vector operations.\n\n## Hermitian rank 2k: C ⟵ α·A·Bᴴ + con( α )·B·Aᴴ + β·C or C ⟵ α·Aᴴ·B + con( α )·Bᴴ·A + β·C\n\ncon( α ) is the conjugate of α.\n\nAᴴ is the conjugate transpose of Matrix A.\n\nBᴴ isthe conjugate transpose of Matrix B.\n\n### cher2k, zher2k \n\nThe naming in blasjs does not reflect the precision used, precision is determined by [argument construction][precision-note]. The naming is maintained for compatibility with the reference implementation.\n\n| subroutine    | operation                                                            | complex    | real | type of matrix C       | blas ref link                             |\n| ------------- | -------------------------------------------------------------------- | ---------- | ---- | ---------------------- | ----------------------------------------- |\n| cher2k/zher2k | C ⟵ α·A·Bᴴ + con( α )·B·Aᴴ + β·C or C ⟵ α·Aᴴ·B + con( α )·Bᴴ·A + β·C | α, A, B, C | β    | upper/lower triangular | [cher2k][ref-cher2k]/[zher2k][ref-zher2k] |\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction cher2k | zher2k(\n    uplo: 'u' | 'l',\n    trans: 'n' | 'c',\n    n: number,\n    k: number,\n    alpha: Complex,\n    a: Matrix,\n    lda: number,\n    b: Matrix,\n    ldb: number,\n    beta: number,\n    c: Matrix,\n    ldc: number\n): void;\n```\n\nSee: _[how to create Matrix](#matrix-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { cher2k,  zher2k } = BLAS.level3;\n```\n\n\u003c/details\u003e\n\n## Symmetric rank 2k operations C ⟵ α·A·Bᵀ + α·B·Aᵀ + β·C, or C ⟵ α·Aᵀ·B +  α·Bᵀ·A + β·C\n\n### ssyr2k, dsyr2k, csyr2k, zsyr2k\n\nThe naming in blasjs does not reflect the precision used, precision is determined by [argument construction][precision-note]. The naming is maintained for compatibility with the reference implementation.\n\n| subroutine    | operation                                                | complex       | real          | type of matrix C       | blas ref link                             |\n| ------------- | -------------------------------------------------------- | ------------- | ------------- | ---------------------- | ----------------------------------------- |\n| ssyr2k/dsyr2k | C ⟵ α·A·Bᵀ + α·B·Aᵀ + β·C, or C ⟵ α·Aᵀ·B +  α·Bᵀ·A + β·C | none          | α, A, β, B, C | upper/lower triangular | [cher2k][ref-cher2k]/[zher2k][ref-zher2k] |\n| csyr2k/zsyr2k | C ⟵ α·A·Bᵀ + α·B·Aᵀ + β·C, or C ⟵ α·Aᵀ·B +  α·Bᵀ·A + β·C | α, A, β, B, C | none          | upper/lower triangular | [csyr2k][ref-csyr2k]/[zsyr2k][ref-zsyr2k] |\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction ssyr2k|dsyr2k(\n    uplo: 'u' | 'l',\n    trans: 'n' | 't' | 'c',\n    n: number,\n    k: number,\n    alpha: number,\n    a: Matrix,\n    lda: number,\n    b: Matrix,\n    ldb: number,\n    beta: number,\n    c: Matrix,\n    ldc: number\n): void;\n\nfunction csyr2k|zsyr2k(\n    uplo: 'u' | 'l',\n    trans: 'n' | 't',\n    n: number,\n    k: number,\n    alpha: Complex,\n    a: Matrix,\n    lda: number,\n    b: Matrix,\n    ldb: number,\n    beta: Complex,\n    c: Matrix,\n    ldc: number\n): void\n```\n\nSee: _[how to create Matrix](#matrix-constructors)_.     \n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { ssyr2k, dsyr2k, csyr2k, zsyr2k } = BLAS.level3;\n```\n\n\u003c/details\u003e\n\n## Hermatian rank k operations C ⟵ α·A·Aᴴ + β·C, or C ⟵ α·Aᴴ·A + β·C\n        \nAᴴ is the conjugate transpose of Matrix A.\n\n### cherk, zherk\n\nThe naming in blasjs does not reflect the precision used, precision is determined by [argument construction][precision-note]. The naming is maintained for compatibility with the reference implementation.\n\n| subroutine  | operation                             | complex | real | type of matrix C       | blas ref link                         |\n| ----------- | ------------------------------------- | ------- | ---- | ---------------------- | ------------------------------------- |\n| cherk/zherk | C ⟵ α·A·Aᴴ + β·C, or C ⟵ α·Aᴴ·A + β·C | A, C    | α, β | upper/lower triangular | [cherk][ref-cherk]/[zherk][ref-zherk] |\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction cherk|zherk(\n    uplo: 'u' | 'l',\n    trans: 'n' | 'c',\n    n: number,\n    k: number,\n    alpha: number,\n    a: Matrix,\n    lda: number,\n    beta: number,\n    c: Matrix,\n    ldc: number\n): void;\n```\n\nSee: _[how to create Matrix](#matrix-constructors)_.     \n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { cherk, zherk } = BLAS.level3;\n```\n\n\u003c/details\u003e\n\n## Symmetric rank k operations C ⟵ α·A·Aᵀ + β·C, or C ⟵ α·Aᵀ·A + β·C\n\n### ssyrk, dsyrk, csyrk, zsyrk   \n\nThe naming in blasjs does not reflect the precision used, precision is determined by [argument construction][precision-note]. The naming is maintained for compatibility with the reference implementation.\n\n| subroutine  | operation                             | complex    | real       | type of matrix C       | blas ref link                         |\n| ----------- | ------------------------------------- | ---------- | ---------- | ---------------------- | ------------------------------------- |\n| ssyrk/dsyrk | C ⟵ α·A·Aᵀ + β·C, or C ⟵ α·Aᵀ·A + β·C | none       | α, A, β, C | upper/lower triangular | [ssyrk][ref-ssyrk]/[dsyrk][ref-dsyrk] |\n| csyrk/zsyrk | C ⟵ α·A·Aᵀ + β·C, or C ⟵ α·Aᵀ·A + β·C | α, A, β, C | none       | upper/lower triangular | [csyrk][ref-csyrk]/[zsyrk][ref-zsyrk] |\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction ssyrk|dsyrk(\n    uplo: 'u' | 'l',\n    trans: 'n' | 't' | 'c',\n    n: number,\n    k: number,\n    alpha: number,\n    a: Matrix,\n    lda: number,\n    beta: number,\n    c: Matrix,\n    ldc: number\n): void;\n\nfunction csyrk|zsyrk(\n    uplo: 'u' | 'l',\n    trans: 'n' | 't' | 'c',\n    n: number,\n    k: number,\n    alpha: number,\n    a: Matrix,\n    lda: number,\n    beta: number,\n    c: Matrix,\n    ldc: number\n): void;\n```\n\nSee: _[how to create Matrix](#matrix-constructors)_.     \n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { ssyrk, dsyrk, csyrk, zsyrk } = BLAS.level3;\n```\n\n\u003c/details\u003e\n\n## Matrix-matrix operations C ⟵ α·_f(A)_·_h(B)_ + β·C or C ⟵ α·_h(B)_·_f(A)_ + β·C\n\nf(A) is the result of an operation on matrix A, like Aᵀ, Aᴴ, or A (no-op)\n\nh(B) is an operation on matrix B, like Bᵀ, Bᴴ, or B (no-op)\n\nS(A) is the set of all possible results of f(A) for a routine.\n\nS(B) is the set of all possible results of h(B) for a routine.\n\n### sgemm,  dgemm, cgemm, zgemm \n\nThe naming in blasjs does not reflect the precision used, precision is determined by [argument construction][precision-note]. The naming is maintained for compatibility with the reference implementation.\n\n| subroutine  | operation                 | S(A)      | S(B)      | real          | complex       | type of matrix C | blas ref link                         |\n| ----------- | ------------------------- | --------- | --------- | ------------- | ------------- | ---------------- | ------------------------------------- |\n| sgemm/dgemm | C ⟵ α·_f(A)_·_h(B)_ + β·C | Aᵀ, A     | Bᵀ, B     | α, A, β, B, C | none          | m x n            | [sgemm][ref-sgemm]/[dgemm][ref-dgemm] |\n| cgemm/zgemm | C ⟵ α·_f(A)_·_h(B)_ + β·C | Aᴴ, Aᵀ, A | Bᴴ, Bᵀ, B | none          | α, A, β, B, C | m x n            | [cgemm][ref-cgemm]/[zgemm][ref-zgemm] |\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction sgemm|dgemm(\n    transA: 'n' | 't' | 'c',\n    transB: 'n' | 't' | 'c',\n    m: number,\n    n: number,\n    k: number,\n    alpha: number,\n    a: Matrix,\n    lda: number,\n    b: Matrix,\n    ldb: number,\n    beta: number,\n    c: Matrix,\n    ldc: number\n): void;\n\nfunction cgemm|zgemm(\n    transA: 'n' | 't' | 'c',\n    transB: 'n' | 't' | 'c',\n    m: number,\n    n: number,\n    k: number,\n    alpha: Complex,\n    a: Matrix,\n    lda: number,\n    b: Matrix,\n    ldb: number,\n    beta: Complex,\n    c: Matrix,\n    ldc: number\n): void\n```\n\nSee: _[how to create Matrix](#matrix-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { sgemm, dgemm, cgemm, zgemm } = BLAS.level3;\n```\n\n\u003c/details\u003e\n\n## Matrix-matrix operations C ⟵ α·A·B + β·C or C ⟵ α·B·A + β·C\n       \n### chemm, zhemm, ssymm, dsymm, csymm, zsymm\n\nThe naming in blasjs does not reflect the precision used, precision is determined by [argument construction][precision-note]. The naming is maintained for compatibility with the reference implementation.\n\n| subroutine  | operation                          | real          | complex       | type of matrix C | blas ref link                         |\n| ----------- | ---------------------------------- | ------------- | ------------- | ---------------- | ------------------------------------- |\n| chemm/zhemm | C ⟵ α·A·B + β·C or C ⟵ α·B·A + β·C | none          | α, A, B, β, C | m x n            | [chemm][ref-chemm]/[zhemm][ref-zhemm] |\n| ssymm/dsymm | C ⟵ α·A·B + β·C or C ⟵ α·B·A + β·C | α, A, B, β, C | none          | m x n            | [ssymm][ref-ssymm]/[dsymm][ref-dsymm] |\n| csymm/zsymm | C ⟵ α·A·B + β·C or C ⟵ α·B·A + β·C | none          | α, A, B, β, C | m x n            | [csymm][ref-csymm]/[zsymm][ref-zsymm] |\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction chemm|zhemm(\n    side: 'l' | 'r',\n    uplo: 'u' | 'l',\n    m: number,\n    n: number,\n    alpha: Complex,\n    a: Matrix,\n    lda: number,\n    b: Matrix,\n    ldb: number,\n    beta: Complex,\n    c: Matrix,\n    ldc: number\n): void;\n\nfunction ssymm|dsymm(\n    side: 'l' | 'r',\n    uplo: 'u' | 'l',\n    m: number,\n    n: number,\n    alpha: number,\n    a: Matrix,\n    lda: number,\n    b: Matrix,\n    ldb: number,\n    beta: number,\n    c: Matrix,\n    ldc: number\n): void\n\nfunction csymm|zsymm(\n    side: 'l' | 'r',\n    uplo: 'u' | 'l',\n    m: number,\n    n: number,\n    alpha: Complex,\n    a: Matrix,\n    lda: number,\n    b: Matrix,\n    ldb: number,\n    beta: Complex,\n    c: Matrix,\n    ldc: number\n): void\n```\n\nSee: _[how to create Matrix](#matrix-constructors)_.\n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { chemm, zhemm,  ssymm, dsymm, csymm, zsymm } = BLAS.level3;\n```\n\n\u003c/details\u003e\n\n## Matrix-matrix operations B ⟵ α·f(A)·B or B ⟵ α·B·f(A)\n\nf(A) is the result of an operation on matrix A, like Aᵀ, Aᴴ, or A (no-op)\n\nS(A) is the set of all possible results of f(A) for a routine.\n\n### strmm, dtrmm, ctrmm, ztrmm \n\nThe naming in blasjs does not reflect the precision used, precision is determined by [argument construction][precision-note]. The naming is maintained for compatibility with the reference implementation.\n\n| subroutine  | operation                    | S(A)      | real | complex | type of matrix B | blas ref link                         |\n| ----------- | ---------------------------- | --------- | ---- | ------- | ---------------- | ------------------------------------- |\n| strmm/dtrmm | B ⟵ α·f(A)·B or B ⟵ α·B·f(A) | A, Aᵀ     | α, B | none    | m x n            | [strmm][ref-strmm]/[dtrmm][ref-dtrmm] |\n| ctrmm/ztrmm | B ⟵ α·f(A)·B or B ⟵ α·B·f(A) | A, Aᵀ, Aᴴ | none | α, A, B | m x n            | [ctrmm][ref-ctrmm]/[ztrmm][ref-ztrmm] |\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e (click to show)\u003c/summary\u003e\n\n_decl_\n\n```typescript\nfunction strmm|dtrmm(\n    side: 'l' | 'r',\n    uplo: 'u' | 'l',\n    transA: 'n' | 't' | 'c',\n    diag: 'u' | 'n',\n    m: number,\n    n: number,\n    alpha: number,\n    a: Matrix,\n    lda: number,\n    b: Matrix,\n    ldb: number\n): void;\n\nfunction ctrmm|ztrmm(\n    side: 'l' | 'r',\n    uplo: 'u' | 'l',\n    transA: 'n' | 't' | 'c',\n    diag: 'u' | 'n',\n    m: number,\n    n: number,\n    alpha: Complex,\n    a: Matrix,\n    lda: number,\n    b: Matrix,\n    ldb: number\n): void;\n```\n\nSee: _[how to create Matrix](#matrix-constructors)_.     \n\nUsage:\n\n```javascript\nconst BLAS = require('blasjs');\nconst { strmm, dtrmm,  ctrmm, ztrmm } = BLAS.level3;\n```\n\n\u003c/details\u003e\n\n## Solves the matrix equations: _f( A )_·X = α·B, or X·_f( A )_ = α·B\n\nf(A) is the result of an operation on matrix A, like Aᵀ, Aᴴ, or A (no-op)\n\nS(A) is the set of all possible results of f(A) for a routine.\n\n### strsm, dtrsm, ctrsm, ztrsm \n\nThe naming in blasjs does not reflect the precision used, precision is determined by [argument construction][precision-note]. The naming is maintained for compatibility with the reference implementation.\n\n| subroutine  | operation                             | S(A)      | real    | complex | type of matrix B | blas ref link                         |\n| ----------- | ------------------------------------- | --------- | ------- | ------- | ---------------- | ------------------------------------- |\n| strsm/dtrsm | _f( A )_·X = α·B, or X·_f( A )_ = α·B | A, Aᵀ     | α, A, B | none    | m x n            | [strsm][ref-strsm]/[dtrsm][ref-dtrsm] |\n| ctrsm/ztrsm | _f( A )_·X = α·B, or X·_f( A )_ = α·B | A, Aᵀ, Aᴴ | none    | α, A, B | m x n            | [ctrsm][ref-ctrsm]/[ztrsm][ref-ztrsm] |\n\n\n\n\n[srotg]: https://en.wikipedia.org/wiki/Givens_rotation\n[givenmodified]: https://www.ibm.com/support/knowledgecenter/en/SSFHY8_5.5.0/com.ibm.cluster.essl.v5r5.essl100.doc/am5gr_srotm.htm\n\n[caxpy]:  http://www.netlib.org/lapack/explore-html/da/df6/group__complex__blas__level1_ga9605cb98791e2038fd89aaef63a31be1.html\n\n[blas-site]: http://www.netlib.org/blas/\n[blas-source]: https://github.com/Reference-LAPACK/lapack/tree/master/BLAS\n[float32-array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float32Array\n\n[float64-array]:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float64Array]\n\n[mimic-fortran-args]: #mimicking-FORTRAN-OUT-Argument]\n[precision-note]: #a-note-on-numeric-precision\n[language-differences]: #language-differences-with-fortranblas\n[givens-rotation]: https://en.wikipedia.org/wiki/Givens_rotation#Stable_calculation\n[apply-modified-givens-transformation]: https://en.wikipedia.org/wiki/Givens_rotation#Stable_calculation\n[ref-snrm2]: http://www.netlib.org/lapack/explore-html/d7/df1/snrm2_8f.html\n[ref-dnrm2]: http://www.netlib.org/lapack/explore-html/da/d7f/dnrm2_8f.html\n[ref-scnrm2]: http://www.netlib.org/lapack/explore-html/db/d66/scnrm2_8f.html\n[ref-srotg]: http://www.netlib.org/lapack/explore-html/d7/d26/srotg_8f.html\n[ref-zrotg]: http://www.netlib.org/lapack/explore-html/dc/dfe/zrotg_8f.html\n\n[ref-srotmg]: http://www.netlib.org/lapack/explore-html/dd/d48/srotmg_8f.html\n[ref-drotmg]: http://www.netlib.org/lapack/explore-html/df/deb/drotmg_8f.html\n\n[construct-modified-givens-transformation]: https://www.researchgate.net/profile/JV_Mccanny/publication/224312422_Modified_Givens_rotations_and_their_application_to_matrix_inversion/links/55cdcefa08aee19936f80088/Modified-Givens-rotations-and-their-application-to-matrix-inversion.pdf\n\n[ref-srotm]: http://www.netlib.org/lapack/explore-html/d6/d0f/srotm_8f.html\n[ref-drotm]: http://www.netlib.org/lapack/explore-html/d8/d7b/drotm_8f.html\n\n[ref-xcswap]: http://www.netlib.org/lapack/explore-html/d1/d44/cswap_8f.html\n\n[ref-dznrm2]: http://www.netlib.org/lapack/explore-html/d9/d19/dznrm2_8f.html\n[ref-drotg]: http://www.netlib.org/lapack/explore-html/de/d13/drotg_8f.html\n[ref-crotg]: http://www.netlib.org/lapack/explore-html/dc/de6/crotg_8f.html\n[ref-zswap]: http://www.netlib.org/lapack/explore-html/d3/dc0/zswap_8f.html\n[ref-zdotc]: http://www.netlib.org/lapack/explore-html/d6/db8/zdotc_8f.html\n[ref-cdotc]: http://www.netlib.org/lapack/explore-html/dd/db2/cdotc_8f.html\n[ref-zdotu]: http://www.netlib.org/lapack/explore-html/db/d2d/zdotu_8f.html\n[ref-sdot]: http://www.netlib.org/lapack/explore-html/d0/d16/sdot_8f.html\n[ref-dsdot]: http://www.netlib.org/lapack/explore-html/dc/d01/dsdot_8f.html\n[ref-idamax]: http://www.netlib.org/lapack/explore-html/dd/de0/idamax_8f.html\n[ref-izamax]: http://www.netlib.org/lapack/explore-html/d0/da5/izamax_8f.html\n[ref-scopy]: http://www.netlib.org/lapack/explore-html/de/dc0/scopy_8f.html\n[ref-dcopy]: http://www.netlib.org/lapack/explore-html/da/d6c/dcopy_8f.html\n[ref-ccopy]: http://www.netlib.org/lapack/explore-html/d9/dfb/ccopy_8f.html\n[ref-zcopy]: http://www.netlib.org/lapack/explore-html/d6/d53/zcopy_8f.html\n[ref-daxpy]: http://www.netlib.org/lapack/explore-html/d9/dcd/daxpy_8f.html\n[ref-zaxpy]: http://www.netlib.org/lapack/explore-html/d7/db2/zaxpy_8f.html\n\n[ref-icamax]: http://www.netlib.org/lapack/explore-html/dd/d51/icamax_8f.html\n[ref-isamax]: http://www.netlib.org/lapack/explore-html/d6/d44/isamax_8f.html\n[ref-sdsdot]: http://www.netlib.org/lapack/explore-html/d9/d47/sdsdot_8f.html\n[ref-cdotc]: http://www.netlib.org/lapack/explore-html/dd/db2/cdotc_8f.html\n[ref-zdotc]: http://www.netlib.org/lapack/explore-html/d6/db8/zdotc_8f.html\n[ref-sswap]: http://www.netlib.org/lapack/explore-html/d9/da9/sswap_8f.html\n[ref-sdot]: http://www.netlib.org/lapack/explore-html/d0/d16/sdot_8f.html\n[ref-srot]: http://www.netlib.org/lapack/explore-html/db/d6c/srot_8f.html\n[ref-drot]: http://www.netlib.org/lapack/explore-html/dc/d23/drot_8f.html\n[ref-csrot]: http://www.netlib.org/lapack/explore-html/d1/dbb/csrot_8f.html\n[ref-zdrot]: http://www.netlib.org/lapack/explore-html/d4/de9/zdrot_8f.html\n\n[ref-sscal]: http://www.netlib.org/lapack/explore-html/d9/d04/sscal_8f.html\n[ref-dscal]: http://www.netlib.org/lapack/explore-html/d4/dd0/dscal_8f.html\n[ref-cscal]: http://www.netlib.org/lapack/explore-html/dc/d81/cscal_8f.html\n[ref-zscal]: http://www.netlib.org/lapack/explore-html/d2/d74/zscal_8f.html\n[ref-csscal]: http://www.netlib.org/lapack/explore-html/de/d5e/csscal_8f.html\n[ref-zdscal]: http://www.netlib.org/lapack/explore-html/dd/d76/zdscal_8f.html\n\n[ref-sasum]: http://www.netlib.org/lapack/explore-html/df/d1f/sasum_8f.html\n[ref-dasum]: http://www.netlib.org/lapack/explore-html/de/d05/dasum_8f.html\n[ref-scasum]: http://www.netlib.org/lapack/explore-html/db/d53/scasum_8f.html\n[ref-dzasum]: http://www.netlib.org/lapack/explore-html/df/d0f/dzasum_8f.html\n\n[ref-cher2]: http://www.netlib.org/lapack/explore-html/db/d87/cher2_8f.html\n[ref-zher2]: http://www.netlib.org/lapack/explore-html/da/d8a/zher2_8f.html\n[ref-chpr2]: http://www.netlib.org/lapack/explore-html/d6/d44/chpr2_8f.html\n[ref-zhpr2]: http://www.netlib.org/lapack/explore-html/d5/d52/zhpr2_8f.html\n\n[ref-sspr2]: http://www.netlib.org/lapack/explore-html/db/d3e/sspr2_8f.html\n[ref-dspr2]: http://www.netlib.org/lapack/explore-html/dd/d9e/dspr2_8f.html\n[ref-ssyr2]: http://www.netlib.org/lapack/explore-html/db/d99/ssyr2_8f.html\n[ref-dsyr2]: http://www.netlib.org/lapack/explore-html/de/d41/dsyr2_8f.html \n\n[ref-sger]: http://www.netlib.org/lapack/explore-html/db/d5c/sger_8f.html\n[ref-dger]: http://www.netlib.org/lapack/explore-html/dc/da8/dger_8f.html\n[ref-cgerc]: http://www.netlib.org/lapack/explore-html/dd/d84/cgerc_8f.html\n[ref-zgerc]: http://www.netlib.org/lapack/explore-html/d3/dad/zgerc_8f.html\n[ref-cgeru]: http://www.netlib.org/lapack/explore-html/db/d5f/cgeru_8f.html\n[ref-zgeru]: http://www.netlib.org/lapack/explore-html/d7/d12/zgeru_8f.html\n\n[ref-cher]: http://www.netlib.org/lapack/explore-html/d3/d6d/cher_8f.html\n[ref-zher]: http://www.netlib.org/lapack/explore-html/de/d0e/zher_8f.html\n[ref-chpr]: http://www.netlib.org/lapack/explore-html/db/dcd/chpr_8f.html\n[ref-zhpr]: http://www.netlib.org/lapack/explore-html/de/de1/zhpr_8f.html\n \n[ref-sspr]: http://www.netlib.org/lapack/explore-html/d2/d9b/sspr_8f.html\n[ref-dspr]: http://www.netlib.org/lapack/explore-html/dd/dba/dspr_8f.html\n[ref-ssyr]: http://www.netlib.org/lapack/explore-html/d6/dac/ssyr_8f.html\n[ref-dsyr]: http://www.netlib.org/lapack/explore-html/d3/d60/dsyr_8f.html \n \n[ref-cgbmv]: http://www.netlib.org/lapack/explore-html/d0/d75/cgbmv_8f.html\n[ref-chbmv]: http://www.netlib.org/lapack/explore-html/db/dc2/chbmv_8f.html\n[ref-dgbmv]: http://www.netlib.org/lapack/explore-html/d2/d3f/dgbmv_8f.html\n[ref-dsbmv]: http://www.netlib.org/lapack/explore-html/d8/d1e/dsbmv_8f.html\n[ref-sgbmv]: http://www.netlib.org/lapack/explore-html/d6/d46/sgbmv_8f.html\n[ref-ssbmv]: http://www.netlib.org/lapack/explore-html/d3/da1/ssbmv_8f.html\n[ref-zgbmv]: http://www.netlib.org/lapack/explore-html/d9/d46/zgbmv_8f.html\n[ref-zhbmv]: http://www.netlib.org/lapack/explore-html/d3/d1a/zhbmv_8f.html\n[ref-ctbmv]: http://www.netlib.org/lapack/explore-html/d3/dcd/ctbmv_8f.html\n[ref-dtbmv]: http://www.netlib.org/lapack/explore-html/df/d29/dtbmv_8f.html\n[ref-stbmv]: http://www.netlib.org/lapack/explore-html/d6/d7d/stbmv_8f.html\n[ref-ztbmv]: http://www.netlib.org/lapack/explore-html/d3/d39/ztbmv_8f.html\n[ref-cgemv]: http://www.netlib.org/lapack/explore-html/d4/d8a/cgemv_8f.html\n[ref-chemv]: http://www.netlib.org/lapack/explore-html/d7/d51/chemv_8f.html\n[ref-dgemv]: http://www.netlib.org/lapack/explore-html/dc/da8/dgemv_8f.html\n[ref-sgemv]: http://www.netlib.org/lapack/explore-html/db/d58/sgemv_8f.html \n[ref-zgemv]: http://www.netlib.org/lapack/explore-html/db/d40/zgemv_8f.html\n[ref-zhemv]: http://www.netlib.org/lapack/explore-html/d0/ddd/zhemv_8f.html\n[ref-chpmv]: http://www.netlib.org/lapack/explore-html/d3/d1a/zhbmv_8f.html\n[ref-dspmv]: http://www.netlib.org/lapack/explore-html/d4/d85/dspmv_8f.html\n[ref-sspmv]: http://www.netlib.org/lapack/explore-html/d8/d68/sspmv_8f.html\n[ref-zhpmv]: http://www.netlib.org/lapack/explore-html/d0/d60/zhpmv_8f.html\n[ref-dsymv]: http://www.netlib.org/lapack/explore-html/d8/dbe/dsymv_8f.html\n[ref-ssymv]: http://www.netlib.org/lapack/explore-html/d2/d94/ssymv_8f.html\n        \n[ref-stpmv]: http://www.netlib.org/lapack/explore-html/db/db1/stpmv_8f.html\n[ref-dtpmv]: http://www.netlib.org/lapack/explore-html/dc/dcd/dtpmv_8f.html\n[ref-ctpmv]: http://www.netlib.org/lapack/explore-html/d4/dbb/ctpmv_8f.html\n[ref-ztpmv]: http://www.netlib.org/lapack/explore-html/d2/d9e/ztpmv_8f.html\n[ref-strmv]: http://www.netlib.org/lapack/explore-html/de/d45/strmv_8f.html\n[ref-dtrmv]: http://www.netlib.org/lapack/explore-html/dc/d7e/dtrmv_8f.html\n[ref-ctrmv]: http://www.netlib.org/lapack/explore-html/d9/d5f/ctbsv_8f.html\n[ref-ztrmv]: http://www.netlib.org/lapack/explore-html/d0/dd1/ztrmv_8f.html\n[ref-stbsv]: http://www.netlib.org/lapack/explore-html/d0/d1f/stbsv_8f.html \n[ref-dtbsv]: http://www.netlib.org/lapack/explore-html/d4/dcf/dtbsv_8f.html\n[ref-ddot]: http://www.netlib.org/lapack/explore-html/d5/df6/ddot_8f.html\n[ref-ctbsv]: http://www.netlib.org/lapack/explore-html/d9/d5f/ctbsv_8f.html\n[ref-ztbsv]: http://www.netlib.org/lapack/explore-html/d4/d5a/ztbsv_8f.html\n\n[ref-stpsv]: http://www.netlib.org/lapack/explore-html/d0/d7c/stpsv_8f.html\n[ref-dtpsv]: http://www.netlib.org/lapack/explore-html/d9/d84/dtpsv_8f.html\n\n[ref-ctpsv]: http://www.netlib.org/lapack/explore-html/d8/d56/ctpsv_8f.html\n[ref-ztpsv]: http://www.netlib.org/lapack/explore-html/da/d57/ztpsv_8f.html\n\n[ref-ctrsv]: http://www.netlib.org/lapack/explore-html/d4/dc8/ctrsv_8f.html\n[ref-ztrsv]: http://www.netlib.org/lapack/explore-html/d1/d2f/ztrsv_8f.html \n\n[ref-strsv]: http://www.netlib.org/lapack/explore-html/d0/d2a/strsv_8f.html\n[ref-dtrsv]: http://www.netlib.org/lapack/explore-html/d6/d96/dtrsv_8f.html\n\n[ref-cher2k]: http://www.netlib.org/lapack/explore-html/d1/d82/cher2k_8f.html\n[ref-zher2k]: http://www.netlib.org/lapack/explore-html/d7/dfa/zher2k_8f.html\n[ref-cherk]: http://www.netlib.org/lapack/explore-html/d8/d52/cherk_8f.html\n[ref-zherk]: http://www.netlib.org/lapack/explore-html/d1/db1/zherk_8f.html\n[ref-ssyrk]: http://www.netlib.org/lapack/explore-html/d0/d40/ssyrk_8f.html\n[ref-dsyrk]: http://www.netlib.org/lapack/explore-html/dc/d05/dsyrk_8f.html\n[ref-csyrk]: http://www.netlib.org/lapack/explore-html/d3/d6a/csyrk_8f.html\n[ref-zsyrk]: http://www.netlib.org/lapack/explore-html/de/d54/zsyrk_8f.html\n\n[ref-sgemm]: http://www.netlib.org/lapack/explore-html/d4/de2/sgemm_8f.html\n[ref-dgemm]: http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html\n[ref-cgemm]: http://www.netlib.org/lapack/explore-html/d6/d5b/cgemm_8f.html\n[ref-zgemm]: http://www.netlib.org/lapack/explore-html/d7/d76/zgemm_8f.html\n[ref-chemm]: http://www.netlib.org/lapack/explore-html/d3/d66/chemm_8f.html\n[ref-zhemm]: http://www.netlib.org/lapack/explore-html/d6/d3e/zhemm_8f.html\n[ref-strmm]: http://www.netlib.org/lapack/explore-html/df/d01/strmm_8f.html\n[ref-dtrmm]: http://www.netlib.org/lapack/explore-html/dd/d19/dtrmm_8f.html\n[ref-ctrmm]: http://www.netlib.org/lapack/explore-html/d4/d9b/ctrmm_8f.html\n[ref-ztrmm]: http://www.netlib.org/lapack/explore-html/d8/de1/ztrmm_8f.html\n\n[ref-ssymm]: http://www.netlib.org/lapack/explore-html/d7/d42/ssymm_8f.html\n[ref-dsymm]: http://www.netlib.org/lapack/explore-html/db/d59/csymm_8f.html\n\n[ref-csymm]: http://www.netlib.org/lapack/explore-html/d8/de1/ztrmm_8f.html\n[ref-zsymm]: http://www.netlib.org/lapack/explore-html/df/d51/zsymm_8f.html\n[ref-strsm]: http://www.netlib.org/lapack/explore-html/d2/d8b/strsm_8f.html\n[ref-dtrsm]: http://www.netlib.org/lapack/explore-html/de/da7/dtrsm_8f.html\n[ref-ctrmm]: http://www.netlib.org/lapack/explore-html/d4/d9b/ctrmm_8f.html\n[ref-ztrmm]: http://www.netlib.org/lapack/explore-html/d8/de1/ztrmm_8f.html\n[ref-csyr2k]: http://www.netlib.org/lapack/explore-html/de/d7e/csyr2k_8f.html\n[ref-zsyr2k]: http://www.netlib.org/lapack/explore-html/df/d20/zsyr2k_8f.html\n\n[ref-ctrsm]: http://www.netlib.org/lapack/explore-html/de/d30/ctrsm_8f.html\n[ref-ztrsm]: http://www.netlib.org/lapack/explore-html/d1/d39/ztrsm_8f.html\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fr-js%2Fblasjs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fr-js%2Fblasjs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fr-js%2Fblasjs/lists"}