Matrix multiplication: Difference between revisions

Added Easylang
m (Added output.)
(Added Easylang)
(47 intermediate revisions by 25 users not shown)
Line 6:
They can be of any dimensions, so long as the number of columns of the first matrix is equal to the number of rows of the second matrix.
<br><br>
 
=={{header|11l}}==
{{trans|Nim}}
 
<syntaxhighlight lang="11l">F matrix_mul(m1, m2)
assert(m1[0].len == m2.len)
V r = [[0.0] * m2[0].len] * m1.len
L(j) 0 .< m1.len
L(i) 0 .< m2[0].len
V s = 0.0
L(k) 0 .< m2.len
s += m1[j][k] * m2[k][i]
r[j][i] = s
R r
 
F to_str(m)
V result = ‘([’
L(r) m
I result.len > 2
result ‘’= "]\n ["
L(val) r
result ‘’= ‘#5.2’.format(val)
R result‘])’
 
V a = [[1.0, 1.0, 1.0, 1.0],
[2.0, 4.0, 8.0, 16.0],
[3.0, 9.0, 27.0, 81.0],
[4.0, 16.0, 64.0, 256.0]]
 
V b = [[ 4.0, -3.0 , 4/3.0, -1/4.0],
[-13/3.0, 19/4.0, -7/3.0, 11/24.0],
[ 3/2.0, -2.0 , 7/6.0, -1/4.0],
[ -1/6.0, 1/4.0, -1/6.0, 1/24.0]]
 
print(to_str(a))
print(to_str(b))
print(to_str(matrix_mul(a, b)))
print(to_str(matrix_mul(b, a)))</syntaxhighlight>
 
{{out}}
<pre>
([ 1.00 1.00 1.00 1.00]
[ 2.00 4.00 8.00 16.00]
[ 3.00 9.00 27.00 81.00]
[ 4.00 16.00 64.00 256.00])
([ 4.00 -3.00 1.33 -0.25]
[ -4.33 4.75 -2.33 0.46]
[ 1.50 -2.00 1.17 -0.25]
[ -0.17 0.25 -0.17 0.04])
([ 1.00 0.00 -0.00 -0.00]
[ 0.00 1.00 -0.00 -0.00]
[ 0.00 0.00 1.00 0.00]
[ 0.00 0.00 0.00 1.00])
([ 1.00 0.00 0.00 0.00]
[ 0.00 1.00 -0.00 0.00]
[ 0.00 0.00 1.00 0.00]
[ 0.00 0.00 -0.00 1.00])
</pre>
 
=={{header|360 Assembly}}==
<langsyntaxhighlight lang="360asm">* Matrix multiplication 06/08/2015
MATRIXRC CSECT Matrix multiplication
USING MATRIXRC,R13
Line 113 ⟶ 171:
W DS CL16
YREGS
END MATRIXRC</langsyntaxhighlight>
{{out}}
<pre> 9 12 15
Line 119 ⟶ 177:
29 40 51
39 54 69</pre>
 
=={{header|Action!}}==
{{libheader|Action! Tool Kit}}
<syntaxhighlight lang="action!">INCLUDE "D2:PRINTF.ACT" ;from the Action! Tool Kit
 
DEFINE PTR="CARD"
 
TYPE Matrix=[
BYTE width,height
PTR data] ;INT ARRAY
 
PROC PrintMatrix(Matrix POINTER m)
BYTE i,j
INT ARRAY d
CHAR ARRAY s(10)
 
d=m.data
FOR j=0 TO m.height-1
DO
FOR i=0 TO m.width-1
DO
StrI(d(j*m.width+i),s)
PrintF("%2S ",s)
OD
PutE()
OD
RETURN
 
PROC Create(MATRIX POINTER m BYTE w,h INT ARRAY a)
m.width=w
m.height=h
m.data=a
RETURN
 
PROC MatrixMul(Matrix POINTER m1,m2,res)
BYTE i,j,k
INT ARRAY d1,d2,dres,sum
 
IF m1.width#m2.height THEN
Print("Invalid size of matrices for multiplication!")
Break()
FI
d1=m1.data
d2=m2.data
dres=res.data
 
res.width=m2.width
res.height=m1.height
 
FOR j=0 TO res.height-1
DO
FOR i=0 TO res.width-1
DO
sum=0
FOR k=0 TO m1.width-1
DO
sum==+d1(k+j*m1.width)*d2(i+k*m2.width)
OD
dres(j*res.width+i)=sum
OD
OD
RETURN
 
PROC Main()
MATRIX m1,m2,res
INT ARRAY
d1=[2 1 4 0 1 1],
d2=[6 3 65535 0 1 1 0 4 65534 5 0 2],
dres(8)
 
Put(125) PutE() ;clear the screen
 
Create(m1,3,2,d1)
Create(m2,4,3,d2)
Create(res,0,0,dres)
MatrixMul(m1,m2,res)
 
PrintMatrix(m1)
PutE() PrintE("multiplied by") PutE()
PrintMatrix(m2)
PutE() PrintE("equals") PutE()
PrintMatrix(res)
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Matrix_multiplication.png Screenshot from Atari 8-bit computer]
<pre>
2 1 4
0 1 1
 
multiplied by
 
6 3 -1 0
1 1 0 4
-2 5 0 2
 
equals
 
5 27 -2 12
-1 6 0 6
</pre>
 
=={{header|Ada}}==
Ada has matrix multiplication predefined for any floating-point or complex type.
The implementation is provided by the standard library packages Ada.Numerics.Generic_Real_Arrays and Ada.Numerics.Generic_Complex_Arrays correspondingly. The following example illustrates use of real matrix multiplication for the type Float:
<langsyntaxhighlight lang="ada">with Ada.Text_IO; use Ada.Text_IO;
with Ada.Numerics.Real_Arrays; use Ada.Numerics.Real_Arrays;
 
Line 153 ⟶ 311:
begin
Put (A * B);
end Matrix_Product;</langsyntaxhighlight>
{{out}}
<pre>
Line 162 ⟶ 320:
</pre>
The following code illustrates how matrix multiplication could be implemented from scratch:
<langsyntaxhighlight lang="ada">package Matrix_Ops is
type Matrix is array (Natural range <>, Natural range <>) of Float;
function "*" (Left, Right : Matrix) return Matrix;
Line 187 ⟶ 345:
return Temp;
end "*";
end Matrix_Ops;</langsyntaxhighlight>
 
=={{header|ALGOL 68}}==
Line 195 ⟶ 353:
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of FORMATted transput}}
An example of user defined Vector and Matrix Multiplication Operators:
<langsyntaxhighlight lang="algol68">MODE FIELD = LONG REAL; # field type is LONG REAL #
INT default upb:=3;
MODE VECTOR = [default upb]FIELD;
Line 254 ⟶ 412:
exception index error:
putf(stand error, $x"Exception: index error."l$)
)</langsyntaxhighlight>
{{out}}
<pre>
Line 363 ⟶ 521:
exception index error:
putf(stand error, $x"Exception: index error."l$)
 
=={{header|Amazing Hopper}}==
<syntaxhighlight lang="amazing hopper">
#include <hopper.h>
main:
first matrix=0, second matrix=0,a=-1
{5,2},rand array(a),mulby(10),ceil, cpy(first matrix), puts,{"\n"},puts
{2,3},rand array(a),mulby(10),ceil, cpy(second matrix), puts,{"\n"},puts
{first matrix,second matrix},mat mul, println
exit(0)
</syntaxhighlight>
Alternatively, the follow code in macro-natural-Hopper:
<syntaxhighlight lang="amazing hopper">
#include <natural.h>
#include <hopper.h>
main:
get a matrix of '5,2' integer random numbers, remember it in 'first matrix' and put it with a newline
get a matrix of '2,3' integer random numbers, remember it in 'second matrix' and put it with a newline
now take 'first matrix', and take 'second matrix', and multiply it; then, print with a new line.
exit(0)
</syntaxhighlight>
{{out}}
<pre>
2 2
1 5
3 4
6 6
4 8
 
7 1 6
6 2 4
 
26 6 20
37 11 26
45 11 34
78 18 60
76 20 56
</pre>
 
=={{header|APL}}==
Matrix multiply in APL is just <tt>+.×</tt>. For example:
 
<langsyntaxhighlight lang="apl"> x ← +.×
A ← ↑A*¨⊂A←⍳4 ⍝ Same A as in other examples (1 1 1 1⍪ 2 4 8 16⍪ 3 9 27 81,[0.5] 4 16 64 256)
Line 376 ⟶ 572:
0.00 1.00 0.00 0.00
0.00 0.00 1.00 0.00
0.00 0.00 0.00 1.00</langsyntaxhighlight>
 
By contrast, A×B is for element-by-element multiplication of arrays of the same shape, and if they are simple elements, this is ordinary multiplication.
 
 
 
 
 
 
 
 
 
 
 
=={{header|AppleScript}}==
{{trans|JavaScript}}
<langsyntaxhighlight AppleScriptlang="applescript">--------------------- MATRIX MULTIPLY --------------------
 
-- matrixMultiply :: Num a => [[a]] -> [[a]] -> [[a]]
Line 540 ⟶ 746:
return lst
end tell
end zipWith</langsyntaxhighlight>
{{Out}}
<langsyntaxhighlight AppleScriptlang="applescript">{{51, -8, 26, -18}, {-8, -38, -6, 34}, {33, 42, 38, -14}, {17, 74, 72, 44}}</langsyntaxhighlight>
 
=={{header|Arturo}}==
 
<syntaxhighlight lang="rebol">printMatrix: function [m][
loop m 'row -> print map row 'val [pad to :string .format:".2f" val 6]
print "--------------------------------"
]
 
multiply: function [a,b][
X: size a
Y: size first b
result: array.of: @[X Y] 0
 
loop 0..X-1 'i [
loop 0..Y-1 'j [
loop 0..(size first a)-1 'k ->
result\[i]\[j]: result\[i]\[j] + a\[i]\[k] * b\[k]\[j]
]
]
return result
]
A: [[1.0 1.0 1.0 1.0]
[2.0 4.0 8.0 16.0]
[3.0 9.0 27.0 81.0]
[4.0 16.0 64.0 256.0]]
 
B: @[@[ 4.0 0-3.0 4/3.0 0-1/4.0]
@[0-13/3.0 19/4.0 0-7/3.0 11/24.0]
@[ 3/2.0 0-2.0 7/6.0 0-1/4.0]
@[ 0-1/6.0 1/4.0 0-1/6.0 1/24.0]]
 
printMatrix A
printMatrix B
printMatrix multiply A B
printMatrix multiply B A</syntaxhighlight>
 
{{out}}
 
<pre> 1.00 1.00 1.00 1.00
2.00 4.00 8.00 16.00
3.00 9.00 27.00 81.00
4.00 16.00 64.00 256.00
--------------------------------
4.00 -3.00 1.33 -0.25
-4.33 4.75 -2.33 0.46
1.50 -2.00 1.17 -0.25
-0.17 0.25 -0.17 0.04
--------------------------------
1.00 0.00 -0.00 -0.00
0.00 1.00 -0.00 -0.00
0.00 0.00 1.00 0.00
0.00 0.00 0.00 1.00
--------------------------------
1.00 0.00 0.00 0.00
0.00 1.00 -0.00 0.00
0.00 0.00 1.00 0.00
0.00 0.00 -0.00 1.00
--------------------------------</pre>
 
=={{header|AutoHotkey}}==
ahk [http://www.autohotkey.com/forum/topic44657-150.html discussion]
<langsyntaxhighlight lang="autohotkey">Matrix("b"," ; rows separated by ","
, 1 2 ; entries separated by space or tab
, 2 3
Line 597 ⟶ 862:
}
}
}</langsyntaxhighlight>
===Using Objects===
<langsyntaxhighlight AutoHotkeylang="autohotkey">Multiply_Matrix(A,B){
if (A[1].MaxIndexCount() <> B.MaxIndexCount())
return ["Dimension Error"]
RColsR := A[1].MaxIndex()>B[1].MaxIndex()?, RRows := A[1].MaxIndexCount(), RCols:B= b[1].MaxIndexCount()
RRows := A.MaxIndex()>B.MaxIndex()?A.MaxIndex():B.MaxIndex(), R := []
Loop, % RRows {
RRow:=A_Index
loop, % RCols {
RCol:=A_Index, v := 0
loop % A[1].MaxIndexCount()
col := A_Index, v += A[RRow, col] * B[col, RCol]
R[RRow,RCol] := v
}
}
return R
}</langsyntaxhighlight>
Examples:<langsyntaxhighlight AutoHotkeylang="autohotkey">A := [[1,2]
, [3,4]
, [5,6]
Line 633 ⟶ 897:
Res .= (A_Index=1?"":"`t") col (Mod(A_Index,M[1].MaxIndex())?"":"`n")
return Trim(Res,"`n")
}</langsyntaxhighlight>
{{out}}
<pre>9 12 15
Line 641 ⟶ 905:
 
=={{header|AWK}}==
<langsyntaxhighlight AWKlang="awk"># Usage: GAWK -f MATRIX_MULTIPLICATION.AWK filename
# Separate matrices a and b by a blank line
BEGIN {
Line 694 ⟶ 958:
function max(m, n) {
return m > n ? m : n
}</langsyntaxhighlight>
<p><b>Input:</b></p>
<pre>
Line 713 ⟶ 977:
{{works with|QuickBasic|4.5}}
{{trans|Java}}
<langsyntaxhighlight lang="qbasic">Assume the matrices to be multiplied are a and b
IF (LEN(a,2) = LEN(b)) 'if valid dims
n = LEN(a,2)
Line 736 ⟶ 1,000:
ELSE
PRINT "invalid dimensions"
END IF</langsyntaxhighlight>
 
==={{header|Applesoft BASIC}}===
A nine-liner that fits on one screen. The code and variable names are similar to [[#BASIC|BASIC]] with DATA from [[Full_BASIC|Full BASIC]].
<syntaxhighlight lang="gwbasic"> 1 FOR K = 0 TO 1:M = O:N = P: READ O,P: IF K THEN DIM B(O,P): IF N < > O THEN PRINT "INVALID DIMENSIONS": STOP
2 IF NOT K THEN DIM A(O,P)
3 FOR I = 1 TO O: FOR J = 1 TO P: IF K THEN READ B(I,J)
4 IF NOT K THEN READ A(I,J)
5 NEXT J,I,K: DIM AB(M,P): FOR I = 1 TO M: FOR J = 1 TO P: FOR K = 1 TO N:AB(I,J) = AB(I,J) + (A(I,K) * B(K,J)): NEXT K,J,I: FOR I = 1 TO M: FOR J = 1 TO P: PRINT MID$ (S$,1 + (J = 1),1)AB(I,J);:S$ = " " + CHR$ (13): NEXT J,I
10000 DATA4,2
10010 DATA1,2,3,4,5,6,7,8
20000 DATA2,3
20010 DATA1,2,3,4,5,6</syntaxhighlight>
 
===Full BASIC===
{{works with|Full BASIC}}
{{trans|BBC_BASIC}}
<langsyntaxhighlight lang="basic">DIM matrix1(4,2),matrix2(2,3)
 
MAT READ matrix1
Line 754 ⟶ 1,030:
 
MAT product=matrix1*matrix2
MAT PRINT product</langsyntaxhighlight>
{{out}}
<pre> 9 12 15
Line 765 ⟶ 1,041:
(assumes default lower bound of 0):
 
<langsyntaxhighlight lang="bbcbasic"> DIM matrix1(3,1), matrix2(1,2), product(3,2)
matrix1() = 1, 2, \
Line 783 ⟶ 1,059:
PRINT
NEXT
</syntaxhighlight>
</lang>
{{out}}
<pre> 9 12 15
Line 789 ⟶ 1,065:
29 40 51
39 54 69</pre>
 
=={{header|BQN}}==
<code>Mul</code> is a matrix multiplication idiom from [https://mlochbaum.github.io/bqncrate/ BQNcrate.]
 
<syntaxhighlight lang="bqn">Mul ← +˝∘×⎉1‿∞
 
(>⟨
⟨1, 2, 3⟩
⟨4, 5, 6⟩
⟨7, 8, 9⟩
⟩) Mul >⟨
⟨1, 2, 3, 4⟩
⟨5, 6, 7, 8⟩
⟨9, 10, 11, 12⟩
⟩</syntaxhighlight><syntaxhighlight lang="bqn">┌─
╵ 20 23 26 29
56 68 80 92
92 113 134 155
┘</syntaxhighlight>
[https://mlochbaum.github.io/BQN/try.html#code=TXVsIOKGkCAry53iiJjDl+KOiTHigL/iiJ4KCig+4p+oCiAg4p+oMSwgMiwgM+KfqQogIOKfqDQsIDUsIDbin6kKICDin6g3LCA4LCA54p+pCuKfqSkgTXVsID7in6gKICDin6gxLCAgMiwgIDMsIDTin6kKICDin6g1LCAgNiwgIDcsIDjin6kKICDin6g5LCAxMCwgMTEsIDEy4p+pCuKfqQo= Try It!]
 
=={{header|Burlesque}}==
 
<langsyntaxhighlight lang="burlesque">
blsq ) {{1 2}{3 4}{5 6}{7 8}}{{1 2 3}{4 5 6}}mmsp
9 12 15
Line 798 ⟶ 1,094:
29 40 51
39 54 69
</syntaxhighlight>
</lang>
 
=={{header|C}}==
<syntaxhighlight lang="c">#include <stdio.h>
For performance critical work involving matrices, especially large or sparse ones, always consider using an established library such as BLAS first.
<lang c>#include <stdio.h>
#include <stdlib.h>
 
#define MAT_ELEM(rows,cols,r,c) (r*cols+c)
/* Make the data structure self-contained. Element at row i and col j
is x[i * w + j]. More often than not, though, you might want
to represent a matrix some other way */
typedef struct { int h, w; double *x;} matrix_t, *matrix;
 
//Improve performance by assuming output matrices do not overlap with
inline double dot(double *a, double *b, int len, int step)
//input matrices. If this is C++, use the __restrict extension instead
#ifdef __cplusplus
typedef double * const __restrict MAT_OUT_t;
#else
typedef double * const restrict MAT_OUT_t;
#endif
typedef const double * const MAT_IN_t;
 
static inline void mat_mult(
const int m,
const int n,
const int p,
MAT_IN_t a,
MAT_IN_t b,
MAT_OUT_t c)
{
for (int row=0; row<m; row++) {
double r = 0;
for (int col=0; col<p; col++) {
while (len--) {
c[MAT_ELEM(m,p,row,col)] = 0;
r += *a++ * *b;
for (int i=0; i<n; i++) {
b += step;
c[MAT_ELEM(m,p,row,col)] += a[MAT_ELEM(m,n,row,i)]*b[MAT_ELEM(n,p,i,col)];
}
}
return r;
}
}
}
 
static inline void mat_show(
matrix mat_new(int h, int w)
const int m,
const int p,
MAT_IN_t a)
{
for (int row=0; row<m;row++) {
matrix r = malloc(sizeof(matrix_t) + sizeof(double) * w * h);
for (int col=0; col<p;col++) {
r->h = h, r->w = w;
printf("\t%7.3f", a[MAT_ELEM(m,p,row,col)]);
r->x = (double*)(r + 1);
}
return r;
putchar('\n');
}
}
 
int main(void)
matrix mat_mul(matrix a, matrix b)
{
double a[4*4] = {1, 1, 1, 1,
matrix r;
2, 4, 8, 16,
double *p, *pa;
3, 9, 27, 81,
int i, j;
4, 16, 64, 256};
if (a->w != b->h) return 0;
 
double b[4*3] = { 4.0, -3.0, 4.0/3,
r = mat_new(a->h, b->w);
-13.0/3, 19.0/4, -7.0/3,
p = r->x;
for (pa = a->x, i = 0; i < a->h; i++ 3.0/2, pa += a->w)2.0, 7.0/6,
-1.0/6, 1.0/4, -1.0/6};
for (j = 0; j < b->w; j++)
*p++ = dot(pa, b->x + j, a->w, b->w);
return r;
}
 
double c[4*3] = {0};
void mat_show(matrix a)
{
mat_mult(4,4,3,a,b,c);
int i, j;
mat_show(4,3,c);
double *p = a->x;
return 0;
for (i = 0; i < a->h; i++, putchar('\n'))
for (j = 0; j < a->w; j++)
printf("\t%7.3f", *p++);
putchar('\n');
}
 
</syntaxhighlight>
int main()
{
double da[] = { 1, 1, 1, 1,
2, 4, 8, 16,
3, 9, 27, 81,
4,16, 64, 256 };
double db[] = { 4.0, -3.0, 4.0/3,
-13.0/3, 19.0/4, -7.0/3,
3.0/2, -2.0, 7.0/6,
-1.0/6, 1.0/4, -1.0/6};
 
matrix_t a = { 4, 4, da }, b = { 4, 3, db };
matrix c = mat_mul(&a, &b);
 
/* mat_show(&a), mat_show(&b); */
mat_show(c);
/* free(c) */
return 0;
}</lang>
 
=={{header|C sharp|C#}}==
Line 877 ⟶ 1,166:
This code should work with any version of the .NET Framework and C# language
 
==={{header|Class}}===
<lang csharp>public class Matrix
 
<syntaxhighlight lang="csharp">public class Matrix
{
int n;
Line 920 ⟶ 1,211:
return result;
}
}</langsyntaxhighlight>
 
==={{header|Extension Method}}===
Implementation of matrix multiplication and matrix display for 2D arrays using an extension method
 
<syntaxhighlight lang="csharp">
public static class LinearAlgebra
{
public static double[,] Product(this double[,] a, double[,] b)
{
int na = a.GetLength(0), ma = a.GetLength(1);
int nb = b.GetLength(0), mb = b.GetLength(1);
 
if (ma != nb)
{
throw new ArgumentException("Incompatible Matrix Sizes.", nameof(b));
}
double[,] c = new double[na, mb];
for (int i = 0; i < na; i++)
{
for (int j = 0; j < mb; j++)
{
double sum = 0;
for (int k = 0; k < ma; k++)
{
sum += a[i, k] * b[k, j];
}
c[i, j] = sum;
}
}
return c;
}
public static string Show(this double[,] a, string formatting = "g4", int columnWidth = 12)
{
int na = a.GetLength(0), ma = a.GetLength(1);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < na; i++)
{
sb.Append("|");
for (int j = 0; j < ma; j++)
{
sb.Append(" ");
if (columnWidth > 0)
{
sb.Append(a[i, j].ToString(formatting).PadLeft(columnWidth));
}
else if (columnWidth < 0)
{
sb.Append(a[i, j].ToString(formatting).PadRight(columnWidth));
}
else
{
throw new ArgumentOutOfRangeException(nameof(columnWidth), "Must be non-negative");
}
}
sb.AppendLine(" |");
}
return sb.ToString();
}
}
class Program
{
static void Main(string[] args)
{
double[,] A = new double[,] { { 1, 2, 3 }, { 4, 5, 6 } };
double[,] B = new double[,] { { 8, 7, 6 }, { 5, 4, 3 }, { 2, 1, 0 } };
 
double[,] C = A.Product(B);
Console.WriteLine("A=");
Console.WriteLine(A.Show("f4", 8));
Console.WriteLine("B=");
Console.WriteLine(B.Show("f4", 8));
Console.WriteLine("C=A*B");
Console.WriteLine(C.Show("f4", 8));
 
}
}
</syntaxhighlight>
 
{{out}}
<pre>
A=
| 1.0000 2.0000 3.0000 |
| 4.0000 5.0000 6.0000 |
 
B=
| 8.0000 7.0000 6.0000 |
| 5.0000 4.0000 3.0000 |
| 2.0000 1.0000 0.0000 |
 
C=A*B
| 24.0000 18.0000 12.0000 |
| 69.0000 54.0000 39.0000 |
</pre>
 
=={{header|C++}}==
Line 927 ⟶ 1,311:
 
{{libheader|Blitz++}}
<langsyntaxhighlight lang="cpp">#include <iostream>
#include <blitz/tinymat.h>
 
Line 947 ⟶ 1,331:
 
std::cout << C << std::endl;
}</langsyntaxhighlight>
{{out}}
(3,3):
Line 956 ⟶ 1,340:
===Generic solution===
main.cpp
<langsyntaxhighlight lang="cpp">
#include <iostream>
#include "matrix.h"
Line 993 ⟶ 1,377:
 
} /* main() */
</syntaxhighlight>
</lang>
 
matrix.h
<langsyntaxhighlight lang="cpp">
#ifndef _MATRIX_H
#define _MATRIX_H
Line 1,174 ⟶ 1,558:
 
#endif /* _MATRIX_H */
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,183 ⟶ 1,567:
 
=={{header|Ceylon}}==
<langsyntaxhighlight lang="ceylon">alias Matrix => Integer[][];
 
void printMatrix(Matrix m) {
Line 1,247 ⟶ 1,631:
print("something went wrong!");
}
}</langsyntaxhighlight>
{{out}}
<pre>[1, 2, 3]
Line 1,264 ⟶ 1,648:
 
Overload the '*' operator for arrays
<langsyntaxhighlight lang="chapel">proc *(a:[], b:[]) {
 
if (a.eltType != b.eltType) then
Line 1,284 ⟶ 1,668:
 
return c;
}</langsyntaxhighlight>
 
example usage (I could not figure out the syntax for multi-dimensional array literals)
<langsyntaxhighlight lang="chapel">var m1:[{1..2, 1..2}] int;
m1(1,1) = 1; m1(1,2) = 2;
m1(2,1) = 3; m1(2,2) = 4;
Line 1,311 ⟶ 1,695:
writeln(m5);
 
writeln(m4 * m5);</langsyntaxhighlight>
 
=={{header|Clojure}}==
 
<langsyntaxhighlight lang="lisp">
(defn transpose
[s]
Line 1,332 ⟶ 1,716:
 
(def ma [[1 1 1 1] [2 4 8 16] [3 9 27 81] [4 16 64 256]])
(def mb [[4 -3 4/3 -1/4] [-13/3 19/4 -7/3 11/24] [3/2 -2 7/6 -1/4] [-1/6 1/4 -1/6 1/24]])</langsyntaxhighlight>
 
{{out}}
Line 1,341 ⟶ 1,725:
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang="lisp">(defun matrix-multiply (a b)
(flet ((col (mat i) (mapcar #'(lambda (row) (elt row i)) mat))
(row (mat i) (elt mat i)))
Line 1,349 ⟶ 1,733:
 
;; example use:
(matrix-multiply '((1 2) (3 4)) '((-3 -8 3) (-2 1 4)))</langsyntaxhighlight>
 
<langsyntaxhighlight lang="lisp">(defun matrix-multiply (matrix1 matrix2)
(mapcar
(lambda (row)
(apply #'mapcar
(lambda (&rest column)
(apply #'+ (mapcar #'* row column))) matrix2)) matrix1))</langsyntaxhighlight>
 
The following version uses 2D arrays as inputs.
 
<langsyntaxhighlight lang="lisp">(defun mmul (A B)
(let* ((m (car (array-dimensions A)))
(n (cadr (array-dimensions A)))
Line 1,371 ⟶ 1,755:
sum (* (aref A i j)
(aref B j k))))))
C))</langsyntaxhighlight>
 
Example use:
 
<langsyntaxhighlight lang="lisp">(mmul #2a((1 2) (3 4)) #2a((-3 -8 3) (-2 1 4)))
#2A((-7 -6 11) (-17 -20 25))
</syntaxhighlight>
</lang>
 
Another version:
 
<langsyntaxhighlight lang="lisp">(defun mmult (a b)
(loop
with m = (array-dimension a 0)
Line 1,393 ⟶ 1,777:
sum (* (aref a i j)
(aref b j k)))))
finally (return c)))</langsyntaxhighlight>
 
=={{header|D}}==
===Basic Version===
<langsyntaxhighlight lang="d">import std.stdio, std.string, std.conv, std.numeric,
std.array, std.algorithm;
 
Line 1,430 ⟶ 1,814:
writefln("B = \n" ~ form ~ "\n", b);
writefln("A * B = \n" ~ form, matrixMul(a, b));
}</langsyntaxhighlight>
{{out}}
<pre>A =
Line 1,447 ⟶ 1,831:
 
===Short Version===
<langsyntaxhighlight lang="d">import std.stdio, std.range, std.array, std.numeric, std.algorithm;
 
T[][] matMul(T)(in T[][] A, in T[][] B) pure nothrow /*@safe*/ {
Line 1,462 ⟶ 1,846:
writefln("B = \n" ~ form ~ "\n", b);
writefln("A * B = \n" ~ form, matMul(a, b));
}</langsyntaxhighlight>
The output is the same.
 
===Pure Short Version===
<langsyntaxhighlight lang="d">import std.stdio, std.range, std.numeric, std.algorithm;
 
T[][] matMul(T)(immutable T[][] A, immutable T[][] B) pure nothrow {
Line 1,482 ⟶ 1,866:
writefln("B = \n" ~ form ~ "\n", b);
writefln("A * B = \n" ~ form, matMul(a, b));
}</langsyntaxhighlight>
The output is the same.
 
Line 1,488 ⟶ 1,872:
All array sizes are verified at compile-time (and no matrix is copied).
Same output.
<langsyntaxhighlight lang="d">import std.stdio, std.string, std.numeric, std.algorithm, std.traits;
 
alias TMMul_helper(M1, M2) = Unqual!(ForeachType!(ForeachType!M1))
Line 1,520 ⟶ 1,904:
matrixMul(a, b, result);
writefln("A * B = \n" ~ form, result);
}</langsyntaxhighlight>
=={{header|Delphi}}==
{{libheader| System.SysUtils}}
<syntaxhighlight lang="delphi">
<lang Delphi>
program Matrix_multiplication;
 
Line 1,616 ⟶ 2,000:
readln;
 
end.</langsyntaxhighlight>
{{out}}
<pre>a:
Line 1,632 ⟶ 2,016:
[75,00, 75,00, 75,00]
[117,00, 117,00, 117,00]]</pre>
=={{header|EasyLang}}==
<syntaxhighlight>
proc matmul . m1[][] m2[][] r[][] .
r[][] = [ ]
for i to len m1[][]
r[][] &= [ ]
for j = 1 to len m2[1][]
r[i][] &= 0
for k to len m2[][]
r[i][j] += m1[i][k] * m2[k][j]
.
.
.
.
mat1[][] = [ [ 1 2 3 ] [ 4 5 6 ] ]
mat2[][] = [ [ 1 2 ] [ 3 4 ] [ 5 6 ] ]
matmul mat1[][] mat2[][] erg[][]
print erg[][]
</syntaxhighlight>
 
{{out}}
<pre>
[
[ 22 28 ]
[ 49 64 ]
]
</pre>
 
=={{header|EGL}}==
<syntaxhighlight lang="egl">
<lang EGL>
program Matrix_multiplication type BasicProgram {}
Line 1,668 ⟶ 2,080:
end
end
</syntaxhighlight>
</lang>
 
=={{header|Ela}}==
 
<langsyntaxhighlight lang="ela">open list
 
mmult a b = [ [ sum $ zipWith (*) ar bc \\ bc <- (transpose b) ] \\ ar <- a ]
Line 1,678 ⟶ 2,090:
[[1, 2],
[3, 4]] `mmult` [[-3, -8, 3],
[-2, 1, 4]]</langsyntaxhighlight>
 
=={{header|Elixir}}==
<langsyntaxhighlight lang="elixir">
def mult(m1, m2) do
Enum.map m1, fn (x) -> Enum.map t(m2), fn (y) -> Enum.zip(x, y)
Line 1,695 ⟶ 2,107:
 
 
</syntaxhighlight>
</lang>
 
=={{header|Emacs Lisp}}==
<syntaxhighlight lang="lisp">
(defvar M1 '((2 1 4)
(0 1 1)))
 
(defvar M2 '(( 6 3 -1 0)
( 1 1 0 4)
(-2 5 0 2)))
 
(seq-map (lambda (a1)
(seq-map (lambda (a2) (apply #'+ (seq-mapn #'* a1 a2)))
(apply #'seq-mapn #'list M2)))
M1)
</syntaxhighlight>
 
{{out}}
<pre>
((5 27 -2 12) (-1 6 0 6))
</pre>
 
=={{header|ELLA}}==
Line 1,701 ⟶ 2,133:
 
Code for matrix multiplication hardware design verification:
<langsyntaxhighlight lang="ella">MAC ZIP = ([INT n]TYPE t: vector1 vector2) -> [n][2]t:
[INT k = 1..n](vector1[k], vector2[k]).
Line 1,745 ⟶ 2,177:
).
 
COM test: just displaysignal MOC</langsyntaxhighlight>
 
=={{header|Erlang}}==
<langsyntaxhighlight lang="erlang">
 
%% Multiplies two matrices. Usage example:
Line 1,807 ⟶ 2,239:
multiply_row_by_col(Row, []) ->
[].
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,815 ⟶ 2,247:
 
=={{header|ERRE}}==
<syntaxhighlight lang="erre">
<lang ERRE>
PROGRAM MAT_PROD
 
Line 1,853 ⟶ 2,285:
 
END PROGRAM
</syntaxhighlight>
</lang>
{{out}}<pre>
9 12 15
Line 1,862 ⟶ 2,294:
 
=={{header|Euphoria}}==
<langsyntaxhighlight lang="euphoria">function matrix_mul(sequence a, sequence b)
sequence c
if length(a[1]) != length(b) then
Line 1,877 ⟶ 2,309:
return c
end if
end function</langsyntaxhighlight>
 
=={{header|F#Excel}}==
Excel's MMULT function yields the matrix product of two arrays.
<lang F#>
 
The formula in cell B2 here populates the '''B2:D3''' grid:
{{Out}}
{| class="wikitable"
|-
|||style="text-align:right; font-family:serif; font-style:italic; font-size:120%;"|fx
! colspan="8" style="text-align:left; vertical-align: bottom; font-family:Arial, Helvetica, sans-serif !important;"|=MMULT(F2#, F6#)
|- style="text-align:center; font-family:Arial, Helvetica, sans-serif !important; background-color:#000000; color:#ffffff;"
|
| A
| B
| C
| D
| E
| F
| G
| H
|-
| style="text-align:center; font-family:Arial, Helvetica, sans-serif !important; background-color:#000000; color:#ffffff" | 1
|
| colspan="3" style="font-weight:bold" | Matrix product
|
| colspan="3" style="font-weight:bold" | M1
|-
| style="text-align:center; font-family:Arial, Helvetica, sans-serif !important; background-color:#000000; color:#ffffff" | 2
|
| style="text-align:right; background-color:#cbcefb" | -7
| style="text-align:right" | -6
| style="text-align:right" | 11
|
| style="text-align:right" | 1
| style="text-align:right" | 2
|
|-
| style="text-align:center; font-family:Arial, Helvetica, sans-serif !important; background-color:#000000; color:#ffffff" | 3
|
| style="text-align:right" | -17
| style="text-align:right" | -20
| style="text-align:right" | 25
|
| style="text-align:right" | 3
| style="text-align:right" | 4
|
|-
| style="text-align:center; font-family:Arial, Helvetica, sans-serif !important; background-color:#000000; color:#ffffff" | 4
|
|
|
|
|
|
|
|
|-
| style="text-align:center; font-family:Arial, Helvetica, sans-serif !important; background-color:#000000; color:#ffffff" | 5
|
|
|
|
|
| colspan="3" style="font-weight:bold" | M2
|-
| style="text-align:center; font-family:Arial, Helvetica, sans-serif !important; background-color:#000000; color:#ffffff" | 6
|
|
|
|
|
| style="text-align:right" | -3
| style="text-align:right" | -8
| style="text-align:right" | 3
|-
| style="text-align:center; font-family:Arial, Helvetica, sans-serif !important; background-color:#000000; color:#ffffff" | 7
|
|
|
|
|
| style="text-align:right" | -2
| style="text-align:right" | 1
| style="text-align:right" | 4
|}
 
=={{header|F_Sharp|F#}}==
<syntaxhighlight lang="fsharp">
let MatrixMultiply (matrix1 : _[,] , matrix2 : _[,]) =
let result_row = (matrix1.GetLength 0)
Line 1,893 ⟶ 2,410:
ret
 
</syntaxhighlight>
</lang>
 
=={{header|Factor}}==
Line 1,906 ⟶ 2,423:
Using a list of lists representation. The multiplication is done using three nested loops.
 
<langsyntaxhighlight lang="fantom">
class Main
{
Line 1,938 ⟶ 2,455:
}
}
</syntaxhighlight>
</lang>
 
{{out}}
<pre>
[[1, 2, 3], [4, 5, 6]] times [[1, 2], [3, 4], [5, 6]] = [[22, 28], [49, 64]]
</pre>
 
=={{header|Fermat}}==
<syntaxhighlight lang="fermat">
Array a[3,2]
Array b[2,3]
[a]:=[(2,3,5,7,11,13)]
[b]:=[(1,1,2,3,5,8)]
[a]*[b]
</syntaxhighlight>
{{out}}
<pre>
[[ 9, 25, 66, `
14, 39, 103, `
18, 49, 129 ]]
</pre>
 
Line 1,948 ⟶ 2,480:
{{libheader|Forth Scientific Library}}
{{works with|gforth|0.7.9_20170308}}
<langsyntaxhighlight lang="forth">S" fsl-util.fs" REQUIRED
S" fsl/dynmem.seq" REQUIRED
: F+! ( addr -- ) ( F: r -- ) DUP F@ F+ F! ;
Line 1,961 ⟶ 2,493:
A{{ 3 3 B{{ 3 3 & C{{ mat*
3 3 C{{ }}fprint</langsyntaxhighlight>
 
=={{header|Fortran}}==
In ISO Fortran 90 or later, use the MATMUL intrinsic function to perform Matrix Multiply; use RESHAPE and SIZE intrinsic functions to form the matrices themselves:
<langsyntaxhighlight lang="fortran">real, dimension(n,m) :: a = reshape( [ (i, i=1, n*m) ], [ n, m ] )
real, dimension(m,k) :: b = reshape( [ (i, i=1, m*k) ], [ m, k ] )
real, dimension(size(a,1), size(b,2)) :: c ! C is an array whose first dimension (row) size
Line 1,989 ⟶ 2,521:
do i = 1, n
print *, c(i,:)
end do</langsyntaxhighlight>
For Intel 14.x or later (with compiler switch -assume realloc_lhs)
<langsyntaxhighlight lang="fortran">
program mm
real , allocatable :: a(:,:),b(:,:)
Line 1,999 ⟶ 2,531:
print'(<n>f15.7)',transpose(matmul(a,b))
end program
</syntaxhighlight>
</lang>
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">type Matrix
dim as double m( any , any )
declare constructor ( )
Line 2,045 ⟶ 2,577:
print c.m(2, 0), c.m(2, 1), c.m(2, 2), c.m(2, 3)
print c.m(3, 0), c.m(3, 1), c.m(3, 2), c.m(3, 3)
</syntaxhighlight>
</lang>
 
 
=={{header|Frink}}==
<langsyntaxhighlight lang="frink">matprod[a is array, b is array] :=
{
c = makeArray[[length[a], length[b@0]], 0]
Line 2,063 ⟶ 2,595:
 
return c
}</langsyntaxhighlight>
 
=={{header|Futhark}}==
Line 2,070 ⟶ 2,602:
Note that the transposition need not be manifested, but is merely a change of indexing.
 
<syntaxhighlight lang="futhark">
<lang Futhark>
fun main(x: [n][m]int, y: [m][p]int): [n][p]int =
map (fn xr => map (fn yc => reduce (+) 0 (zipWith (*) xr yc))
(transpose y))
x
</syntaxhighlight>
</lang>
 
=={{header|GAP}}==
<langsyntaxhighlight lang="gap"># Built-in
A := [[1, 2], [3, 4], [5, 6], [7, 8]];
B := [[1, 2, 3], [4, 5, 6]];
Line 2,096 ⟶ 2,628:
# [ 19, 26, 33 ],
# [ 29, 40, 51 ],
# [ 39, 54, 69 ] ]</langsyntaxhighlight>
 
 
=={{header|Generic}}==
<syntaxhighlight lang="cpp">
generic coordinaat
{
ecs
uuii
 
coordinaat() { ecs=+a uuii=+a}
 
coordinaat(ecs_set uuii_set) { ecs = ecs_set uuii=uuii_set }
 
operaator<(c)
{
iph ecs < c.ecs return troo
iph c.ecs < ecs return phals
iph uuii < c.uuii return troo
return phals
}
 
operaator==(connpair) // eecuuols and not eecuuols deriiu phronn operaator<
{
iph this < connpair return phals
iph connpair < this return phals
return troo
}
 
operaator!=(connpair)
{
iph this < connpair return troo
iph connpair < this return troo
return phals
}
 
too_string()
{
return "(" + ecs.too_string() + "," + uuii.too_string() + ")"
}
 
print()
{
str = too_string()
str.print()
}
 
println()
{
str = too_string()
str.println()
}
}
 
generic nnaatrics
{
s // this is a set of coordinaat/ualioo pairs.
iteraator // this field holds an iteraator phor the nnaatrics.
 
nnaatrics() // no parameters required phor nnaatrics construction.
{
s = nioo set() // create a nioo set of coordinaat/ualioo pairs.
iteraator = nul // the iteraator is initially set to nul.
}
 
nnaatrics(copee) // copee the nnaatrics.
{
s = nioo set() // create a nioo set of coordinaat/ualioo pairs.
iteraator = nul // the iteraator is initially set to nul.
 
r = copee.rouus
c = copee.cols
i = 0
uuiil i < r
{
j = 0
uuiil j < c
{
this[i j] = copee[i j]
j++
}
i++
}
}
 
begin { get { return s.begin } } // property: used to commence manual iteraashon.
 
end { get { return s.end } } // property: used to dephiin the end itenn of iteraashon
 
operaator<(a) // les than operaator is corld bii the avl tree algorithnns
{ // this operaator innpliis phor instance that you could potenshalee hav sets ou nnaatricss.
iph cees < a.cees // connpair the cee sets phurst.
return troo
els iph a.cees < cees
return phals
els // the cee sets are eecuuol thairphor connpair nnaatrics elennents.
{
phurst1 = begin
lahst1 = end
phurst2 = a.begin
lahst2 = a.end
 
uuiil phurst1 != lahst1 && phurst2 != lahst2
{
iph phurst1.daata.ualioo < phurst2.daata.ualioo
return troo
els
{
iph phurst2.daata.ualioo < phurst1.daata.ualioo
return phals
els
{
phurst1 = phurst1.necst
phurst2 = phurst2.necst
}
}
}
 
return phals
}
}
 
operaator==(connpair) // eecuuols and not eecuuols deriiu phronn operaator<
{
iph this < connpair return phals
iph connpair < this return phals
return troo
}
 
operaator!=(connpair)
{
iph this < connpair return troo
iph connpair < this return troo
return phals
}
 
 
operaator[cee_a cee_b] // this is the nnaatrics indexer.
{
set
{
trii { s >> nioo cee_ualioo(new coordinaat(cee_a cee_b)) } catch {}
s << nioo cee_ualioo(new coordinaat(nioo integer(cee_a) nioo integer(cee_b)) ualioo)
}
get
{
d = s.get(nioo cee_ualioo(new coordinaat(cee_a cee_b)))
return d.ualioo
}
}
 
operaator>>(coordinaat) // this operaator reennoous an elennent phronn the nnaatrics.
{
s >> nioo cee_ualioo(coordinaat)
return this
}
 
iteraat() // and this is how to iterate on the nnaatrics.
{
iph iteraator.nul()
{
iteraator = s.lepht_nnohst
iph iteraator == s.heder
return nioo iteraator(phals nioo nun())
els
return nioo iteraator(troo iteraator.daata.ualioo)
}
els
{
iteraator = iteraator.necst
iph iteraator == s.heder
{
iteraator = nul
return nioo iteraator(phals nioo nun())
}
els
return nioo iteraator(troo iteraator.daata.ualioo)
}
}
 
couunt // this property returns a couunt ou elennents in the nnaatrics.
{
get
{
return s.couunt
}
}
 
ennptee // is the nnaatrics ennptee?
{
get
{
return s.ennptee
}
}
 
 
lahst // returns the ualioo of the lahst elennent in the nnaatrics.
{
get
{
iph ennptee
throuu "ennptee nnaatrics"
els
return s.lahst.ualioo
}
}
 
too_string() // conuerts the nnaatrics too aa string
{
return s.too_string()
}
 
print() // prints the nnaatrics to the consohl.
{
out = too_string()
out.print()
}
 
println() // prints the nnaatrics as a liin too the consohl.
{
out = too_string()
out.println()
}
 
cees // return the set ou cees ou the nnaatrics (a set of coordinaats).
{
get
{
k = nioo set()
phor e : s k << e.cee
return k
}
}
 
operaator+(p)
{
ouut = nioo nnaatrics()
phurst1 = begin
lahst1 = end
phurst2 = p.begin
lahst2 = p.end
uuiil phurst1 != lahst1 && phurst2 != lahst2
{
ouut[phurst1.daata.cee.ecs phurst1.daata.cee.uuii] = phurst1.daata.ualioo + phurst2.daata.ualioo
phurst1 = phurst1.necst
phurst2 = phurst2.necst
}
return ouut
}
operaator-(p)
{
ouut = nioo nnaatrics()
phurst1 = begin
lahst1 = end
phurst2 = p.begin
lahst2 = p.end
uuiil phurst1 != lahst1 && phurst2 != lahst2
{
ouut[phurst1.daata.cee.ecs phurst1.daata.cee.uuii] = phurst1.daata.ualioo - phurst2.daata.ualioo
phurst1 = phurst1.necst
phurst2 = phurst2.necst
}
return ouut
}
 
rouus
{
get
{
r = +a
phurst1 = begin
lahst1 = end
uuiil phurst1 != lahst1
{
iph r < phurst1.daata.cee.ecs r = phurst1.daata.cee.ecs
phurst1 = phurst1.necst
}
return r + +b
}
}
 
cols
{
get
{
c = +a
phurst1 = begin
lahst1 = end
uuiil phurst1 != lahst1
{
iph c < phurst1.daata.cee.uuii c = phurst1.daata.cee.uuii
phurst1 = phurst1.necst
}
return c + +b
}
}
 
operaator*(o)
{
iph cols != o.rouus throw "rouus-cols nnisnnatch"
reesult = nioo nnaatrics()
rouu_couunt = rouus
colunn_couunt = o.cols
loop = cols
i = +a
uuiil i < rouu_couunt
{
g = +a
uuiil g < colunn_couunt
{
sunn = +a.a
h = +a
uuiil h < loop
{
a = this[i h]
 
b = o[h g]
nn = a * b
sunn = sunn + nn
h++
}
 
reesult[i g] = sunn
 
g++
}
i++
}
return reesult
}
 
suuop_rouus(a b)
{
c = cols
i = 0
uuiil u < cols
{
suuop = this[a i]
this[a i] = this[b i]
this[b i] = suuop
i++
}
}
 
suuop_colunns(a b)
{
r = rouus
i = 0
uuiil i < rouus
{
suuopp = this[i a]
this[i a] = this[i b]
this[i b] = suuop
i++
}
}
 
transpohs
{
get
{
reesult = new nnaatrics()
 
r = rouus
c = cols
i=0
uuiil i < r
{
g = 0
uuiil g < c
{
reesult[g i] = this[i g]
g++
}
i++
}
 
return reesult
}
}
 
deternninant
{
get
{
rouu_couunt = rouus
colunn_count = cols
 
if rouu_couunt != colunn_count
throw "not a scuuair nnaatrics"
 
if rouu_couunt == 0
throw "the nnaatrics is ennptee"
 
if rouu_couunt == 1
return this[0 0]
 
if rouu_couunt == 2
return this[0 0] * this[1 1] -
this[0 1] * this[1 0]
 
temp = nioo nnaatrics()
 
det = 0.0
parity = 1.0
 
j = 0
uuiil j < rouu_couunt
{
k = 0
uuiil k < rouu_couunt-1
{
skip_col = phals
 
l = 0
uuiil l < rouu_couunt-1
{
if l == j skip_col = troo
 
if skip_col
n = l + 1
els
n = l
 
temp[k l] = this[k + 1 n]
l++
}
k++
}
 
det = det + parity * this[0 j] * temp.deeternninant
 
parity = 0.0 - parity
j++
}
 
return det
}
}
 
ad_rouu(a b)
{
c = cols
i = 0
uuiil i < c
{
this[a i] = this[a i] + this[b i]
i++
}
}
 
ad_colunn(a b)
{
c = rouus
i = 0
uuiil i < c
{
this[i a] = this[i a] + this[i b]
i++
}
}
 
subtract_rouu(a b)
{
c = cols
i = 0
uuiil i < c
{
this[a i] = this[a i] - this[b i]
i++
}
}
 
subtract_colunn(a b)
{
c = rouus
i = 0
uuiil i < c
{
this[i a] = this[i a] - this[i b]
i++
}
}
 
nnultiplii_rouu(rouu scalar)
{
c = cols
i = 0
uuiil i < c
{
this[rouu i] = this[rouu i] * scalar
i++
}
}
 
nnultiplii_colunn(colunn scalar)
{
r = rouus
i = 0
uuiil i < r
{
this[i colunn] = this[i colunn] * scalar
i++
}
}
 
diuiid_rouu(rouu scalar)
{
c = cols
i = 0
uuiil i < c
{
this[rouu i] = this[rouu i] / scalar
i++
}
}
 
diuiid_colunn(colunn scalar)
{
r = rouus
i = 0
uuiil i < r
{
this[i colunn] = this[i colunn] / scalar
i++
}
}
 
connbiin_rouus_ad(a b phactor)
{
c = cols
i = 0
uuiil i < c
{
this[a i] = this[a i] + phactor * this[b i]
i++
}
}
 
connbiin_rouus_subtract(a b phactor)
{
c = cols
i = 0
uuiil i < c
{
this[a i] = this[a i] - phactor * this[b i]
i++
}
}
 
connbiin_colunns_ad(a b phactor)
{
r = rouus
i = 0
uuiil i < r
{
this[i a] = this[i a] + phactor * this[i b]
i++
}
}
 
connbiin_colunns_subtract(a b phactor)
{
r = rouus
i = 0
uuiil i < r
{
this[i a] = this[i a] - phactor * this[i b]
i++
}
}
 
inuers
{
get
{
rouu_couunt = rouus
colunn_couunt = cols
 
iph rouu_couunt != colunn_couunt
throw "nnatrics not scuuair"
 
els iph rouu_couunt == 0
throw "ennptee nnatrics"
 
els iph rouu_couunt == 1
{
r = nioo nnaatrics()
r[0 0] = 1.0 / this[0 0]
return r
}
 
gauss = nioo nnaatrics(this)
 
i = 0
uuiil i < rouu_couunt
{
j = 0
uuiil j < rouu_couunt
{
iph i == j
 
gauss[i j + rouu_couunt] = 1.0
els
gauss[i j + rouu_couunt] = 0.0
j++
}
 
i++
}
 
j = 0
uuiil j < rouu_couunt
{
iph gauss[j j] == 0.0
{
k = j + 1
 
uuiil k < rouu_couunt
{
if gauss[k j] != 0.0 {gauss.nnaat.suuop_rouus(j k) break }
k++
}
 
if k == rouu_couunt throw "nnatrics is singioolar"
}
 
phactor = gauss[j j]
iph phactor != 1.0 gauss.diuiid_rouu(j phactor)
 
i = j+1
uuiil i < rouu_couunt
{
gauss.connbiin_rouus_subtract(i j gauss[i j])
i++
}
 
j++
}
 
i = rouu_couunt - 1
uuiil i > 0
{
k = i - 1
uuiil k >= 0
{
gauss.connbiin_rouus_subtract(k i gauss[k i])
k--
}
i--
}
 
reesult = nioo nnaatrics()
 
i = 0
uuiil i < rouu_couunt
{
j = 0
uuiil j < rouu_couunt
{
reesult[i j] = gauss[i j + rouu_couunt]
j++
}
i++
}
 
return reesult
}
}
 
}
</syntaxhighlight>
 
=={{header|Go}}==
===Library gonum/mat===
<langsyntaxhighlight lang="go">package main
 
import (
Line 2,122 ⟶ 3,328:
m.Mul(a, b)
fmt.Println(mat.Formatted(&m))
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,130 ⟶ 3,336:
 
===Library go.matrix===
<langsyntaxhighlight lang="go">package main
 
import (
Line 2,157 ⟶ 3,363:
}
fmt.Printf("Product of A and B:\n%v\n", p)
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,174 ⟶ 3,380:
 
===2D representation===
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 2,233 ⟶ 3,439:
fmt.Printf("Matrix B:\n%s\n\n", B)
fmt.Printf("Product of A and B:\n%s\n\n", P)
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,251 ⟶ 3,457:
</pre>
===Flat representation===
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 2,306 ⟶ 3,512:
}
p.print("Product of A and B:")
}</langsyntaxhighlight>
Output is similar to 2D version.
 
Line 2,312 ⟶ 3,518:
=== Without Indexed Loops ===
Uses transposition to avoid indirect element access via ranges of indexes. "assertConformable()" asserts that a & b are both rectangular lists of lists, and that row-length (number of columns) of a is equal to the column-length (number of rows) of b.
<langsyntaxhighlight lang="groovy">def assertConformable = { a, b ->
assert a instanceof List
assert b instanceof List
Line 2,328 ⟶ 3,534:
}
}
}</langsyntaxhighlight>
 
=== Without Transposition ===
Uses ranges of indexes, the way that matrix multiplication is typically defined. Not as elegant, but it avoids expensive transpositions. Reuses "assertConformable()" from above.
<langsyntaxhighlight lang="groovy">def matmulWOT = { a, b ->
assertConformable(a, b)
Line 2,340 ⟶ 3,546:
}
}
}</langsyntaxhighlight>
 
Test:
<langsyntaxhighlight lang="groovy">def m4by2 = [ [ 1, 2 ],
[ 3, 4 ],
[ 5, 6 ],
Line 2,353 ⟶ 3,559:
matmulWOIL(m4by2, m2by3).each { println it }
println()
matmulWOT(m4by2, m2by3).each { println it }</langsyntaxhighlight>
 
{{out}}
Line 2,370 ⟶ 3,576:
A somewhat inefficient version with lists (''transpose'' is expensive):
 
<langsyntaxhighlight Haskelllang="haskell">import Data.List
 
mmult :: Num a => [[a]] -> [[a]] -> [[a]]
Line 2,378 ⟶ 3,584:
test = [[1, 2],
[3, 4]] `mmult` [[-3, -8, 3],
[-2, 1, 4]]</langsyntaxhighlight>
===With Array===
A more efficient version, based on arrays:
 
<langsyntaxhighlight Haskelllang="haskell">import Data.Array
mmult :: (Ix i, Num a) => Array (i,i) a -> Array (i,i) a -> Array (i,i) a
Line 2,394 ⟶ 3,600:
jr = range (y1,y1')
kr = range (x1,x1')
l = [((i,j), sum [x!(i,k) * y!(k,j) | k <- kr]) | i <- ir, j <- jr]</langsyntaxhighlight>
===With List and without transpose===
<langsyntaxhighlight Haskelllang="haskell">multiply :: Num a => [[a]] -> [[a]] -> [[a]]
multiply us vs = map (mult [] vs) us
where
mult xs [] _ = xs
mult xs _ [] = xs
mult [] (zs : zss) (y : ys) = mult (map (y *) zs) zss ys
mult xs (zs : zss) (y : ys) = mult (zipWith (\u v -> u + v * y) xs zs) zss ys
mult
(zipWith (\u v -> u + v * y) xs zs)
zss
ys
 
main :: IO ()
main =
main = mapM_ print $ multiply [[1, 2], [3, 4]] [[-3, -8, 3], [-2, 1, 4]</lang>
mapM_ print $
multiply
[[1, 2], [3, 4]]
[[-3, -8, 3], [-2, 1, 4]]</syntaxhighlight>
{{out}}
<pre>[-7,-6,11]
Line 2,411 ⟶ 3,625:
 
===With List and without transpose - shorter===
<langsyntaxhighlight Haskelllang="haskell">mult :: Num a => [[a]] -> [[a]] -> [[a]]
mult uss vss =
let go xs
map
((\ | null xs ->= []
| ifotherwise null= foldl1 (zipWith (+)) xs
in go . zipWith (flip (map . (*))) thenvss []<$> uss
else foldl1 (zipWith (+)) xs) .
zipWith (flip (map . (*))) vss)
uss
 
main :: IO ()
main =
main = mapM_ print $ mult [[1, 2], [3, 4]] [[-3, -8, 3], [-2, 1, 4]]</lang>
mapM_ print $
mult [[1, 2], [3, 4]] [[-3, -8, 3], [-2, 1, 4]]</syntaxhighlight>
{{out}}
<pre>[-7,-6,11]
Line 2,428 ⟶ 3,641:
 
===With Numeric.LinearAlgebra===
<langsyntaxhighlight Haskelllang="haskell">import Numeric.LinearAlgebra
 
a, b :: Matrix I
Line 2,436 ⟶ 3,649:
 
main :: IO ()
main = print $ a <> b</langsyntaxhighlight>
{{out}}
<pre>
Line 2,444 ⟶ 3,657:
 
=={{header|HicEst}}==
<langsyntaxhighlight lang="hicest">REAL :: m=4, n=2, p=3, a(m,n), b(n,p), res(m,p)
 
a = $ ! initialize to 1, 2, ..., m*n
Line 2,458 ⟶ 3,671:
ENDDO
 
DLG(DefWidth=4, Text=a, Text=b,Y=0, Text=res,Y=0)</langsyntaxhighlight>
<langsyntaxhighlight lang="hicest">a b res
1 2 1 2 3 9 12 15
3 4 4 5 6 19 26 33
5 6 29 40 51
7 8 39 54 69 </langsyntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
Line 2,469 ⟶ 3,682:
Using the provided matrix library:
 
<langsyntaxhighlight lang="icon">
link matrix
 
Line 2,483 ⟶ 3,696:
write_matrix ("", m3)
end
</syntaxhighlight>
</lang>
 
And a hand-crafted multiply procedure:
 
<langsyntaxhighlight lang="icon">
procedure multiply_matrix (m1, m2)
result := [] # to hold the final matrix
Line 2,503 ⟶ 3,716:
return result
end
</syntaxhighlight>
</lang>
 
{{out}}
Line 2,521 ⟶ 3,734:
=={{header|IDL}}==
 
<langsyntaxhighlight lang="idl">result = arr1 # arr2</langsyntaxhighlight>
 
=={{header|Idris}}==
<langsyntaxhighlight lang="idris">import Data.Vect
 
Matrix : Nat -> Nat -> Type -> Type
Line 2,537 ⟶ 3,750:
multiply' : Num t => Matrix m1 n t -> Matrix m2 n t -> Matrix m1 m2 t
multiply' (a::as) b = map (dot a) b :: multiply' as b
multiply' [] _ = []</langsyntaxhighlight>
 
=={{header|J}}==
Matrix multiply in J is <code>+/ .*</code>. For example:
<langsyntaxhighlight lang="j"> mp =: +/ .* NB. Matrix product
A =: ^/~>:i. 4 NB. Same A as in other examples (1 1 1 1, 2 4 8 16, 3 9 27 81,:4 16 64 256)
Line 2,550 ⟶ 3,763:
0.00 1.00 0.00 0.00
0.00 0.00 1.00 0.00
0.00 0.00 0.00 1.00</langsyntaxhighlight>
The notation is for a generalized inner product so that
<langsyntaxhighlight lang="j">x ~:/ .*. y NB. boolean inner product ( ~: is "not equal" (exclusive or) and *. is "and")
x *./ .= y NB. which rows of x are the same as vector y?
x + / .= y NB. number of places where a value in row x equals the corresponding value in y</langsyntaxhighlight>
[[Floyd-Warshall_algorithm#J|etc.]]
 
Line 2,564 ⟶ 3,777:
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">public static double[][] mult(double a[][], double b[][]){//a[m][n], b[n][p]
if(a.length == 0) return new double[0][0];
if(a[0].length != b.length) return null; //invalid dims
Line 2,582 ⟶ 3,795:
}
return ans;
}</langsyntaxhighlight>
 
=={{header|JavaScript}}==
Line 2,590 ⟶ 3,803:
 
Extends [[Matrix Transpose#JavaScript]]
<langsyntaxhighlight lang="javascript">// returns a new matrix
Matrix.prototype.mult = function(other) {
if (this.width != other.height) {
Line 2,612 ⟶ 3,825:
var a = new Matrix([[1,2],[3,4]])
var b = new Matrix([[-3,-8,3],[-2,1,4]]);
print(a.mult(b));</langsyntaxhighlight>
{{out}}
<pre>-7,-6,11
Line 2,618 ⟶ 3,831:
 
====Functional====
<langsyntaxhighlight JavaScriptlang="javascript">(function () {
'use strict';
 
Line 2,684 ⟶ 3,897:
}
 
})();</langsyntaxhighlight>
{{Out}}
<langsyntaxhighlight Javascriptlang="javascript">[[51, -8, 26, -18], [-8, -38, -6, 34],
[33, 42, 38, -14], [17, 74, 72, 44]]</langsyntaxhighlight>
 
===ES6===
<langsyntaxhighlight JavaScriptlang="javascript">((() => {
'"use strict'";
 
// -------------- MATRIX MULTIPLICATION --------------
 
// matrixMultiply :: Num a => [[a]] -> [[a]] -> [[a]]
Line 2,697 ⟶ 3,912:
b => {
const cols = transpose(b);
 
return map(
return a.map(
compose(
flip(f => cols.map)(colsf),
dotProduct
)
)(a);
};
 
// dotProduct :: Num a => [[a]] -> [[a]] -> [[a]]
const dotProduct = xs =>
compose(sum, zipWith(mul)(xs));
 
// ----------------------- TEST ------------------------
const main = () =>
JSON.stringify(matrixMultiply(
Line 2,717 ⟶ 3,930:
[-3, 5, 0],
[3, 7, -2]
])([
)([
[-1, 1, 4, 8],
[6, 9, 10, 2],
Line 2,723 ⟶ 3,937:
]));
 
 
// ---------------------- GENERIC ----------------------
// --------------------- GENERIC ---------------------
 
// compose (<<<) :: (b -> c) -> (a -> b) -> a -> c
const compose = (...fs) =>
// A function defined by the right-to-left
// composition of all the functions in fs.
fs.reduce(
(f, g) => x => f(g(x)),
Line 2,732 ⟶ 3,949:
);
 
// flip :: (a -> b -> c) -> b -> a -> c
const flip = f =>
x => y => f(y)(x);
 
// lengthdotProduct :: Num a => [[a]] -> Int[[a]] -> [[a]]
const lengthdotProduct = xs =>
// ReturnsSum Infinityof overthe objectsproducts withoutof finitethe corresponding
// length.values Thisin enablestwo ziplists andof zipWiththe to choosesame length.
compose(sum, zipWith(mul)(xs));
// the shorter argument when one is non-finite,
// like cycle, repeat etc
(Array.isArray(xs) || 'string' === typeof xs) ? (
xs.length
) : Infinity;
 
// map :: (a -> b) -> [a] -> [b]
const map = f =>
// The list obtained by applying f
// to each element of xs.
// (The image of xs under f).
xs => xs.map(f);
 
// mul :: Num a => a -> a -> a
const mul = a =>
b => a * b;
 
 
// sum :: (Num a) => [a] -> a
Line 2,761 ⟶ 3,966:
xs.reduce((a, x) => a + x, 0);
 
// take :: Int -> [a] -> [a]
// take :: Int -> String -> String
const take = n =>
// The first n elements of a list,
// string of characters, or stream.
xs => xs.slice(0, n);
 
// transpose :: [[a]] -> [[a]]
Line 2,772 ⟶ 3,971:
// The columns of the input transposed
// into new rows.
// AssumesSimpler input rowsversion of eventranspose, length.assuming input
0 <// rows.length ?of rows[0]even length.map(
Boolean(x, irows.length) =>? rows[0].flatMapmap(
(_, xi) => x[i]rows.flatMap(
v => v[i]
)
) : [];
 
 
// zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
Line 2,784 ⟶ 3,985:
// custom function, rather than with the
// default tuple constructor.
xs => ys => {xs.map(
const(x, i) => f(x)(ys[i])
).slice(
lng = Math.min(length(xs), length(ys)),
0, Math.min(xs.length, vs = take(lng)(ys.length);
return take(lng)(xs);
.map((x, i) => f(x)(vs[i]));
};
 
// MAIN ---
return main();
}))();</langsyntaxhighlight>
{{Out}}
<pre>[[51,-8,26,-18],[-8,-38,-6,34],[33,42,38,-14],[17,74,72,44]]</pre>
Line 2,802 ⟶ 4,001:
 
The function multiply(A;B) assumes its arguments are numeric matrices of the proper dimensions. Note that preallocating the resultant matrix would actually slow things down.
<langsyntaxhighlight lang="jq">def dot_product(a; b):
a as $a | b as $b
| reduce range(0;$a|length) as $i (0; . + ($a[$i] * $b[$i]) );
Line 2,819 ⟶ 4,018:
| reduce range(0; $A|length) as $i
([]; reduce range(0; $p) as $j
(.; .[$i][$j] = dot_product( $A[$i]; $BT[$j] ) )) ;</langsyntaxhighlight>
'''Example'''
((2|sqrt)/2) as $r | [ [$r, $r], [(-($r)), $r]] as $R
Line 2,831 ⟶ 4,030:
Uses module listed in [[Matrix Transpose#Jsish]]
 
<langsyntaxhighlight lang="javascript">/* Matrix multiplication, in Jsish */
require('Matrix');
 
Line 2,848 ⟶ 4,047:
a.mult(b) ==> { height:2, mtx:[ [ -7, -6, 11 ], [ -17, -20, 25 ] ], width:3 }
=!EXPECTEND!=
*/</langsyntaxhighlight>
 
{{out}}
Line 2,856 ⟶ 4,055:
=={{header|Julia}}==
The multiplication is denoted by *
<langsyntaxhighlight Julialang="julia">julia> [1 2 3 ; 4 5 6] * [1 2 ; 3 4 ; 5 6] # product of a 2x3 by a 3x2
2x2 Array{Int64,2}:
22 28
Line 2,864 ⟶ 4,063:
1-element Array{Int64,1}:
14
</syntaxhighlight>
</lang>
 
=={{header|K}}==
<langsyntaxhighlight lang="k"> (1 2;3 4)_mul (5 6;7 8)
(19 22
43 50)</langsyntaxhighlight>
 
=={{header|Klong}}==
<langsyntaxhighlight lang="k"> mul::{[a b];b::+y;{a::x;+/'{a*x}'b}'x}
[[1 2] [3 4]] mul [[5 6] [7 8]]
[[19 22]
[43 50]]</langsyntaxhighlight>
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.1.3
 
typealias Vector = DoubleArray
Line 2,917 ⟶ 4,116:
)
printMatrix(m1 * m2)
}</langsyntaxhighlight>
 
{{out}}
Line 2,929 ⟶ 4,128:
=={{header|Lambdatalk}}==
 
<langsyntaxhighlight lang="scheme">
{require lib_matrix}
 
Line 2,952 ⟶ 4,151:
[ 66, 81,-12],
[-24,-18,150]]
</syntaxhighlight>
</lang>
 
=={{header|Lang5}}==
<langsyntaxhighlight Lang5lang="lang5">[[1 2 3] [4 5 6]] 'm dress
[[1 2] [3 4] [5 6]] 'm dress * .</langsyntaxhighlight>
{{out}}
<pre>[
Line 2,967 ⟶ 4,166:
Use the LFE <code>transpose/1</code> function from [[Matrix transposition]].
 
<langsyntaxhighlight lang="lisp">
(defun matrix* (matrix-1 matrix-2)
(list-comp
Line 2,975 ⟶ 4,174:
(lists:foldl #'+/2 0
(lists:zipwith #'*/2 a b)))))
</syntaxhighlight>
</lang>
 
Usage example in the LFE REPL:
 
<langsyntaxhighlight lang="lisp">
> (set ma '((1 2)
(3 4)
Line 2,989 ⟶ 4,188:
> (matrix* ma mb)
((5 11 17 23) (11 25 39 53) (17 39 61 83) (23 53 83 113))
</syntaxhighlight>
</lang>
 
=={{header|Liberty BASIC}}==
There is no native matrix capability. A set of functions is available at http://www.diga.me.uk/RCMatrixFuncs.bas implementing matrices of arbitrary dimension in a string format.
<syntaxhighlight lang="lb">
<lang lb>
MatrixA$ ="4, 4, 1, 1, 1, 1, 2, 4, 8, 16, 3, 9, 27, 81, 4, 16, 64, 256"
MatrixB$ ="4, 4, 4, -3, 4/3, -1/4 , -13/3, 19/4, -7/3, 11/24, 3/2, -2, 7/6, -1/4, -1/6, 1/4, -1/6, 1/24"
Line 3,004 ⟶ 4,203:
MatrixP$ =MatrixMultiply$( MatrixA$, MatrixB$)
call DisplayMatrix MatrixP$
</syntaxhighlight>
</lang>
 
{{out}}
Line 3,026 ⟶ 4,225:
 
=={{header|Logo}}==
<langsyntaxhighlight lang="logo">TO LISTVMD :A :F :C :NV
;PROCEDURE LISTVMD
;A = LIST
Line 3,130 ⟶ 4,329:
THIS_IS: 5 ROWS X 5 COLS
{{830 1880 2930 3980 5030} {890 2040 3190 4340 5490} {950 2200 3450 4700 5950}
{1010 2360 3710 5060 6410} {1070 2520 3970 5420 6870}}</langsyntaxhighlight>
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">function MatMul( m1, m2 )
if #m1[1] ~= #m2 then -- inner matrix-dimensions must agree
return nil
Line 3,163 ⟶ 4,362:
end
io.write("\n")
end </langsyntaxhighlight>
 
===SciLua===
Using the sci.alg library from scilua.org
<langsyntaxhighlight Lualang="lua">local alg = require("sci.alg")
mat1 = alg.tomat{{1, 2, 3}, {4, 5, 6}}
mat2 = alg.tomat{{1, 2}, {3, 4}, {5, 6}}
mat3 = mat1[] ** mat2[]
print(mat3)</langsyntaxhighlight>
{{out}}
<pre>+22.00000,+28.00000
Line 3,177 ⟶ 4,376:
 
=={{header|M2000 Interpreter}}==
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module CheckMatMult {
\\ Matrix Multiplication
Line 3,245 ⟶ 4,444:
}
CheckMatMult2
</syntaxhighlight>
</lang>
 
{{out}}
Line 3,256 ⟶ 4,455:
 
=={{header|Maple}}==
<langsyntaxhighlight Maplelang="maple">A := <<1|2|3>,<4|5|6>>;
 
B := <<1,2,3>|<4,5,6>|<7,8,9>|<10,11,12>>;
 
A . B;</langsyntaxhighlight>
{{out}}
<pre> [1 2 3]
Line 3,277 ⟶ 4,476:
 
=={{header|MathCortex}}==
<langsyntaxhighlight lang="mathcortex">
>> A = [2,3; -2,1]
2 3
Line 3,289 ⟶ 4,488:
14 10
2 -2
</syntaxhighlight>
</lang>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
 
The Wolfram Language supports both dot products and element-wise multiplication of matrices.
Line 3,297 ⟶ 4,496:
This computes a dot product:
 
<langsyntaxhighlight lang="mathematica">Dot[{{a, b}, {c, d}}, {{w, x}, {y, z}}]</langsyntaxhighlight>
 
With the following output:
 
<langsyntaxhighlight lang="mathematica">{{a w + b y, a x + b z}, {c w + d y, c x + d z}}</langsyntaxhighlight>
 
This also computes a dot product, using the infix . notation:
 
<langsyntaxhighlight lang="mathematica">{{a, b}, {c, d}} . {{w, x}, {y, z}}</langsyntaxhighlight>
 
This does element-wise multiplication of matrices:
 
<langsyntaxhighlight lang="mathematica">Times[{{a, b}, {c, d}}, {{w, x}, {y, z}}]</langsyntaxhighlight>
 
With the following output:
 
<langsyntaxhighlight lang="mathematica">{{a w, b x}, {c y, d z}}</langsyntaxhighlight>
 
Alternative infix notations '*' and ' ' (space, indicating multiplication):
 
<langsyntaxhighlight lang="mathematica">{{a, b}, {c, d}}*{{w, x}, {y, z}}</langsyntaxhighlight>
<langsyntaxhighlight lang="mathematica">{{a, b}, {c, d}} {{w, x}, {y, z}}</langsyntaxhighlight>
 
In all cases matrices can be fully symbolic or numeric or mixed symbolic and numeric.
Line 3,324 ⟶ 4,523:
as complex numbers:
 
<langsyntaxhighlight lang="mathematica">Dot[{{85, 60, 65}, {54, 99, 33}, {46, 52, 87}}, {{89, 77, 98}, {55, 27, 25}, {80, 68, 85}}]</langsyntaxhighlight>
 
With the following output:
 
<langsyntaxhighlight lang="mathematica">{{16065, 12585, 15355}, {12891, 9075, 10572}, {13914, 10862, 13203}}</langsyntaxhighlight>
 
=={{header|MATLAB}}==
Matlab contains two methods of multiplying matrices: by using the "mtimes(matrix,matrix)" function, or the "*" operator.
 
<langsyntaxhighlight MATLABlang="matlab">>> A = [1 2;3 4]
 
A =
Line 3,359 ⟶ 4,558:
 
19 22
43 50</langsyntaxhighlight>
 
=={{header|Maxima}}==
<langsyntaxhighlight lang="maxima">a: matrix([1, 2],
[3, 4],
[5, 6],
Line 3,374 ⟶ 4,573:
[19, 26, 33],
[29, 40, 51],
[39, 54, 69]) */</langsyntaxhighlight>
 
=={{header|Nial}}==
<langsyntaxhighlight lang="nial">|A := 4 4 reshape 1 1 1 1 2 4 8 16 3 9 27 81 4 16 64 256
=1 1 1 1
=2 4 8 16
Line 3,388 ⟶ 4,587:
=1.3e-15 1. -4.4e-16 -3.3e-16
=0. 0. 1. 4.4e-16
=0. 0. 0. 1.</langsyntaxhighlight>
 
=={{header|Nim}}==
{{libheader|strfmt}}
<langsyntaxhighlight lang="nim">import strfmt
 
type Matrix[M, N: static[int]] = array[M, array[N, float]]
Line 3,422 ⟶ 4,621:
echo b
echo a * b
echo b * a</langsyntaxhighlight>
 
{{out}}
Line 3,445 ⟶ 4,644:
 
This version works on arrays of arrays of ints:
<langsyntaxhighlight lang="ocaml">let matrix_multiply x y =
let x0 = Array.length x
and y0 = Array.length y in
Line 3,457 ⟶ 4,656:
done
done;
z</langsyntaxhighlight>
 
# matrix_multiply [|[|1;2|];[|3;4|]|] [|[|-3;-8;3|];[|-2;1;4|]|];;
Line 3,464 ⟶ 4,663:
{{trans|Scheme}}
This version works on lists of lists of ints:
<langsyntaxhighlight lang="ocaml">(* equivalent to (apply map ...) *)
let rec mapn f lists =
assert (lists <> []);
Line 3,480 ⟶ 4,679:
(List.map2 ( * ) row column))
m2)
m1</langsyntaxhighlight>
 
# matrix_multiply [[1;2];[3;4]] [[-3;-8;3];[-2;1;4]];;
Line 3,486 ⟶ 4,685:
 
=={{header|Octave}}==
<langsyntaxhighlight lang="octave">a = zeros(4);
% prepare the matrix
% 1 1 1 1
Line 3,498 ⟶ 4,697:
endfor
b = inverse(a);
a * b</langsyntaxhighlight>
 
=={{header|Ol}}==
This short version works on lists of lists length less than 253 rows and less than 253 columns.
<langsyntaxhighlight lang="scheme">; short version based on 'apply'
(define (matrix-multiply matrix1 matrix2)
(map
Line 3,511 ⟶ 4,710:
matrix2))
matrix1))
</syntaxhighlight>
</lang>
 
> (matrix-multiply '((1 2) (3 4)) '((-3 -8 3) (-2 1 4)))
Line 3,517 ⟶ 4,716:
 
This long version works on lists of lists with any matrix dimensions.
<langsyntaxhighlight lang="scheme">; long version based on recursive cycles
(define (matrix-multiply A B)
(define m (length A))
Line 3,545 ⟶ 4,744:
r))))
rows)))))
</syntaxhighlight>
</lang>
 
Testing large matrices:
<langsyntaxhighlight lang="scheme">; [372x17] * [17x372]
(define M 372)
(define N 17)
Line 3,571 ⟶ 4,770:
 
(for-each print (matrix-multiply A B))
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 3,592 ⟶ 4,791:
(18194582 18269540 18344498 18419456 18494414 18569372 18644330 18719288 18794246 18869204 18944162 19019120 19094078 19169036 19243994 19318952 19393910)
</pre>
 
=={{header|ooRexx}}==
<syntaxhighlight lang="ooRexx">/*REXX program multiplies two matrices together, */
/* displays the matrices and the result. */
Signal On syntax
x.=0
a=.matrix~new('A',4,2,1 2 3 4 5 6 7 8) /* create matrix A */
b=.matrix~new('B',2,3,1 2 3 4 5 6) /* create matrix B */
If a~cols<>b~rows Then
Call exit 'Matrices are incompatible for matrix multiplication',
'a~cols='a~cols'<>b~rows='||b~rows
-- say a~name'[2,2] changed from' a~set(2,2,4711) 'to 4711' ; Pull .
c=multMat(a,b) /* multiply A x B */
a~show
b~show
c~show
Exit
 
multMat: Procedure
Use Arg a,b
c.=0
Do i=1 To a~rows
Do j=1 To b~cols
Do k=1 To a~cols
c.i.j=c.i.j+a~element(i,k)*b~element(k,j)
End /*k*/
End /*j*/
End /*i*/
mm=''
Do i=1 To a~rows
Do j=1 To b~cols
mm=mm C.i.j
End /*j*/
End /*i*/
c=.matrix~new('C',a~rows,b~cols,mm)
Return c
/*--------------------------------------------------------------------*/
Exit:
Say arg(1)
Exit
Syntax:
Say 'Syntax raised in line' sigl
Say sourceline(sigl)
Say 'rc='rc '('errortext(rc)')'
Say '***** There was a problem!'
Exit
 
::class Matrix
/********************************************************************
* Matrix is implemented as an array of rows
* where each row is an arryay of elements.
********************************************************************/
::Attribute name
::Attribute rows
::Attribute cols
 
::Method init
expose m name rows cols
Use Arg name,rows,cols,elements
If words(elements)<>(rows*cols) Then Do
Say 'incorrect number of elements ('words(elements)')<>'||(rows*cols)
m=.nil
Return
End
m=.array~new
Do r=1 To rows
ro=.array~new
Do c=1 To cols
Parse Var elements e elements
ro~append(e)
End
m~append(ro)
End
 
::Method element /* get an element's value */
expose m
Use Arg r,c
ro=m[r]
Return ro[c]
 
::Method set /* set an element's value and return its previous */
expose m
Use Arg r,c,new
ro=m[r]
old=ro[c]
ro[c]=new
Return old
 
::Method show /* display the matrix */
expose m name rows cols
z='+'
b6=left('',6)
Say ''
Say b6 copies('-',7) 'matrix' name copies('-',7)
w=0
Do r=1 To rows
ro=m[r]
Do c=1 To cols
x=ro[c]
w=max(w,length(x))
End
End
Say b6 b6 '+'copies('-',cols*(w+1)+1)'+' /* top border */
Do r=1 To rows
ro=m[r]
line='|' right(ro[1],w) /* element of first colsumn */ /* start with long vertical bar */
Do c=2 To cols /* loop for other columns */
line=line right(ro[c],w) /* append the elements */
End /* c */
Say b6 b6 line '|' /* append a long vertical bar. */
End /* r */
Say b6 b6 '+'copies('-',cols*(w+1)+1)'+' /* bottom border */
Return</syntaxhighlight>
{{Out}}
<pre>
------- matrix A -------
+-----+
| 1 2 |
| 3 4 |
| 5 6 |
| 7 8 |
+-----+
 
------- matrix B -------
+-------+
| 1 2 3 |
| 4 5 6 |
+-------+
 
------- matrix C -------
+----------+
| 9 12 15 |
| 19 26 33 |
| 29 40 51 |
| 39 54 69 |
+----------+ </pre>
 
 
 
=={{header|OxygenBasic}}==
Generic MatMul:
<syntaxhighlight lang="text">
'generic with striding pointers
'def typ float
typedef float typ
'
function MatMul(typ *r,*a,*b, int n=4) 'NxN MATRIX : N=1..
============================================================
int ystep=sizeof typ
int xstep=n*sizeof typ
int i,j,k
sys px
for i=1 to n
px=@a
for j=1 to n
r=0
for k=1 to n
r+=(a*b)
@a+=xstep
@b+=ystep
next
@r+=ystep
px+=ystep
@a=px
@b-=xstep
next
@a-=xstep
@b+=xstep
next
end function
</syntaxhighlight>
 
When using matrices in Video graphics, speed is important. Here is a matrix multiplier written in OxygenBasics's x86 Assembly code.
<langsyntaxhighlight lang="oxygenbasic">
'Example of matrix layout mapped to an array of 4x4 cells
'
Line 3,709 ⟶ 5,078:
 
Print ShowMatrix C,n
</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
<syntaxhighlight lang ="parigp">M*N</langsyntaxhighlight>
 
=={{header|Perl}}==
Line 3,719 ⟶ 5,088:
This function takes two references to arrays of arrays and returns the product as a reference to a new anonymous array of arrays.
 
<langsyntaxhighlight lang="perl">sub mmult
{
our @a; local *a = shift;
Line 3,753 ⟶ 5,122:
 
$c = mmult(\@a,\@b);
display($c)</langsyntaxhighlight>
{{out}}
<pre> -7 -6 11
Line 3,759 ⟶ 5,128:
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>function matrix_mul(sequence a, sequence b)
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
if length(a[1]) != length(b) then
<span style="color: #008080;">function</span> <span style="color: #000000;">matrix_mul</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">)</span>
crash("invalid aguments")
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">ha</span><span style="color: #0000FF;">,</span><span style="color: #000000;">wa</span><span style="color: #0000FF;">,</span><span style="color: #000000;">hb</span><span style="color: #0000FF;">,</span><span style="color: #000000;">wb</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">apply</span><span style="color: #0000FF;">({</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span><span style="color: #000000;">a</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span><span style="color: #000000;">b</span><span style="color: #0000FF;">,</span><span style="color: #000000;">b</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]},</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">)</span>
end if
<span style="color: #008080;">if</span> <span style="color: #000000;">wa</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">hb</span> <span style="color: #008080;">then</span> <span style="color: #7060A8;">crash</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"invalid aguments"</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
sequence c = repeat(repeat(0,length(b[1])),length(a))
<span style="color: #004080;">sequence</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">wb</span><span style="color: #0000FF;">),</span><span style="color: #000000;">ha</span><span style="color: #0000FF;">)</span>
for i=1 to length(a) do
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">ha</span> <span style="color: #008080;">do</span>
for j=1 to length(b[1]) do
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">wb</span> <span style="color: #008080;">do</span>
for k=1 to length(a[1]) do
<span style="color: #008080;">for</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">wa</span> <span style="color: #008080;">do</span>
c[i][j] += a[i][k]*b[k][j]
<span style="color: #000000;">c</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]*</span><span style="color: #000000;">b</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">][</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
return c
<span style="color: #008080;">return</span> <span style="color: #000000;">c</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
 
ppOpt({pp_Nest,1,pp_IntFmt,"%3d",pp_FltFmt,"%3.0f",pp_IntCh,false})
<span style="color: #7060A8;">ppOpt</span><span style="color: #0000FF;">({</span><span style="color: #004600;">pp_Nest</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #004600;">pp_IntFmt</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%3d"</span><span style="color: #0000FF;">,</span><span style="color: #004600;">pp_FltFmt</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%3.0f"</span><span style="color: #0000FF;">,</span><span style="color: #004600;">pp_IntCh</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">})</span>
 
constant A = { { 1, 2 },
<span style="color: #008080;">constant</span> <span style="color: #000000;">A</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span> <span style="color: #0000FF;">{</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">2</span> <span style="color: #0000FF;">},</span>
{ 3, 4 },
<span style="color: #0000FF;">{</span> <span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">4</span> <span style="color: #0000FF;">},</span>
{ 5, 6 },
<span style="color: #0000FF;">{</span> <span style="color: #000000;">5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">6</span> <span style="color: #0000FF;">},</span>
{ 7, 8 }},
<span style="color: #0000FF;">{</span> <span style="color: #000000;">7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">8</span> <span style="color: #0000FF;">}},</span>
B = { { 1, 2, 3 },
<span style="color: #000000;">B</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span> <span style="color: #0000FF;">{</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">3</span> <span style="color: #0000FF;">},</span>
{ 4, 5, 6 }}
<span style="color: #0000FF;">{</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">6</span> <span style="color: #0000FF;">}}</span>
pp(matrix_mul(A,B))
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">matrix_mul</span><span style="color: #0000FF;">(</span><span style="color: #000000;">A</span><span style="color: #0000FF;">,</span><span style="color: #000000;">B</span><span style="color: #0000FF;">))</span>
 
constant C = { { 1, 1, 1, 1 },
<span style="color: #008080;">constant</span> <span style="color: #000000;">C</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span> <span style="color: #0000FF;">{</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span> <span style="color: #0000FF;">},</span>
{ 2, 4, 8, 16 },
<span style="color: #0000FF;">{</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">16</span> <span style="color: #0000FF;">},</span>
{ 3, 9, 27, 81 },
<span style="color: #0000FF;">{</span> <span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">27</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">81</span> <span style="color: #0000FF;">},</span>
{ 4, 16, 64, 256 }},
<span style="color: #0000FF;">{</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">16</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">64</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">256</span> <span style="color: #0000FF;">}},</span>
D = { { 4, -3, 4/3, -1/ 4 },
<span style="color: #000000;">D</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span> <span style="color: #0000FF;">{</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">/</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">/</span> <span style="color: #000000;">4</span> <span style="color: #0000FF;">},</span>
{-13/3, 19/4, -7/3, 11/24 },
<span style="color: #0000FF;">{-</span><span style="color: #000000;">13</span><span style="color: #0000FF;">/</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">19</span><span style="color: #0000FF;">/</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">7</span><span style="color: #0000FF;">/</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">11</span><span style="color: #0000FF;">/</span><span style="color: #000000;">24</span> <span style="color: #0000FF;">},</span>
{ 3/2, -2, 7/6, -1/ 4 },
<span style="color: #0000FF;">{</span> <span style="color: #000000;">3</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">7</span><span style="color: #0000FF;">/</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">/</span> <span style="color: #000000;">4</span> <span style="color: #0000FF;">},</span>
{ -1/6, 1/4, -1/6, 1/24 }}
<span style="color: #0000FF;">{</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">/</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">/</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">/</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">/</span><span style="color: #000000;">24</span> <span style="color: #0000FF;">}}</span>
pp(matrix_mul(C,D))
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">matrix_mul</span><span style="color: #0000FF;">(</span><span style="color: #000000;">C</span><span style="color: #0000FF;">,</span><span style="color: #000000;">D</span><span style="color: #0000FF;">))</span>
 
constant E = {{1, 2, 3},
<span style="color: #008080;">constant</span> <span style="color: #000000;">F</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">3</span><span style="color: #0000FF;">},</span>
{4, 5, 6},
<span style="color: #0000FF;">{</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">},</span>
{7, 8, 9}},
<span style="color: #0000FF;">{</span><span style="color: #000000;">7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">9</span><span style="color: #0000FF;">}},</span>
F = {{1, 0, 0},
<span style="color: #000000;">G</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
{0, 1, 0},
<span style="color: #0000FF;">{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
{0, 0, 1}}
<span style="color: #0000FF;">{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">}}</span>
pp(matrix_mul(E,F))
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">matrix_mul</span><span style="color: #0000FF;">(</span><span style="color: #000000;">F</span><span style="color: #0000FF;">,</span><span style="color: #000000;">G</span><span style="color: #0000FF;">))</span>
 
constant G = {{1,2},
<span style="color: #008080;">constant</span> <span style="color: #000000;">H</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">},</span>
{3,4}},
<span style="color: #0000FF;">{</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">}},</span>
H = {{5,6},
<span style="color: #000000;">I</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6</span><span style="color: #0000FF;">},</span>
{7,8}}
<span style="color: #0000FF;">{</span><span style="color: #000000;">7</span><span style="color: #0000FF;">,</span><span style="color: #000000;">8</span><span style="color: #0000FF;">}}</span>
pp(matrix_mul(G,H))
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">matrix_mul</span><span style="color: #0000FF;">(</span><span style="color: #000000;">H</span><span style="color: #0000FF;">,</span><span style="color: #000000;">I</span><span style="color: #0000FF;">))</span>
 
constant r = sqrt(2)/2,
<span style="color: #008080;">constant</span> <span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sqrt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span>
R = {{ r,r},
<span style="color: #000000;">R</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span> <span style="color: #000000;">r</span><span style="color: #0000FF;">,</span><span style="color: #000000;">r</span><span style="color: #0000FF;">},</span>
{-r,r}}
<span style="color: #0000FF;">{-</span><span style="color: #000000;">r</span><span style="color: #0000FF;">,</span><span style="color: #000000;">r</span><span style="color: #0000FF;">}}</span>
pp(matrix_mul(R,R))
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">matrix_mul</span><span style="color: #0000FF;">(</span><span style="color: #000000;">R</span><span style="color: #0000FF;">,</span><span style="color: #000000;">R</span><span style="color: #0000FF;">))</span>
 
-- large matrix example from OI:
<span style="color: #000080;font-style:italic;">-- large matrix example from OI:</span>
function row(integer i, l) return tagset(i+l,i) end function
<span style="color: #008080;">function</span> <span style="color: #000000;">row</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">l</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">return</span> <span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">l</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
constant I = apply(true,row,{tagset(16,0),371}),
<span style="color: #008080;">constant</span> <span style="color: #000000;">J</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #000000;">row</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">16</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">),</span><span style="color: #000000;">371</span><span style="color: #0000FF;">}),</span>
J = apply(true,row,{tagset(371,0),16})
<span style="color: #000000;">K</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #000000;">row</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">371</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">),</span><span style="color: #000000;">16</span><span style="color: #0000FF;">})</span>
pp(shorten(apply(true,shorten,{matrix_mul(I,J),{""},2}),"",2))</lang>
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">shorten</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">shorten</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">matrix_mul</span><span style="color: #0000FF;">(</span><span style="color: #000000;">J</span><span style="color: #0000FF;">,</span><span style="color: #000000;">K</span><span style="color: #0000FF;">),{</span><span style="color: #008000;">""</span><span style="color: #0000FF;">},</span><span style="color: #000000;">2</span><span style="color: #0000FF;">}),</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">))</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
Line 3,841 ⟶ 5,212:
{18194582,18269540, `...`, 19318952,19393910}}
</pre>
Note that you get some "-0" in the second result under p2js due to differences in rounding behaviour between JavaScript and desktop/Phix.
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(de matMul (Mat1 Mat2)
(mapcar
'((Row)
Line 3,852 ⟶ 5,224:
(matMul
'((1 2 3) (4 5 6))
'((6 -1) (3 2) (0 -3)) )</langsyntaxhighlight>
{{out}}
<pre>-> ((12 -6) (39 -12))</pre>
 
=={{header|PL/I}}==
<syntaxhighlight lang="pl/i">
<lang PL/I>
/* Matrix multiplication of A by B, yielding C */
MMULT: procedure (a, b, c);
Line 3,881 ⟶ 5,253:
end;
end MMULT;
</syntaxhighlight>
</lang>
 
=={{header|Pop11}}==
 
<langsyntaxhighlight lang="pop11">define matmul(a, b) -> c;
lvars ba = boundslist(a), bb = boundslist(b);
lvars i, i0 = ba(1), i1 = ba(2);
Line 3,907 ⟶ 5,279:
endfor;
endfor;
enddefine;</langsyntaxhighlight>
 
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
<lang PowerShell>
function multarrays($a, $b) {
$n,$m,$p = ($a.Count - 1), ($b.Count - 1), ($b[0].Count - 1)
Line 3,944 ⟶ 5,316:
"`$a * `$c ="
show (multarrays $a $c)
</syntaxhighlight>
</lang>
<b>Output:</b>
<pre>
Line 3,971 ⟶ 5,343:
{{trans|Scheme}}
{{works with|SWI Prolog|5.9.9}}
<langsyntaxhighlight lang="prolog">% SWI-Prolog has transpose/2 in its clpfd library
:- use_module(library(clpfd)).
 
Line 3,981 ⟶ 5,353:
% as lists of lists. M3 is the product of M1 and M2
mmult(M1, M2, M3) :- transpose(M2,MT), maplist(mm_helper(MT), M1, M3).
mm_helper(M2, I1, M3) :- maplist(dot(I1), M2, M3).</langsyntaxhighlight>
 
=={{header|PureBasic}}==
Matrices represented as integer arrays with rows in the first dimension and columns in the second.
<langsyntaxhighlight PureBasiclang="purebasic">Procedure multiplyMatrix(Array a(2), Array b(2), Array prd(2))
Protected ar = ArraySize(a()) ;#rows for matrix a
Protected ac = ArraySize(a(), 2) ;#cols for matrix a
Line 4,007 ⟶ 5,379:
ProcedureReturn #False ;multiplication not performed, dimensions invalid
EndIf
EndProcedure</langsyntaxhighlight>
Additional code to demonstrate use.
<langsyntaxhighlight PureBasiclang="purebasic">DataSection
Data.i 2,3 ;matrix a (#rows, #cols)
Data.i 1,2,3, 4,5,6 ;elements by row
Line 4,062 ⟶ 5,434:
Input()
CloseConsole()
EndIf</langsyntaxhighlight>
{{out}}
<pre>matrix a: (2, 3)
Line 4,078 ⟶ 5,450:
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">a=((1, 1, 1, 1), # matrix A #
(2, 4, 8, 16),
(3, 9, 27, 81),
Line 4,115 ⟶ 5,487:
print '%8.2f '%val,
print ']'
print ')'</langsyntaxhighlight>
 
Another one, {{trans|Scheme}}
<langsyntaxhighlight lang="python">from operator import mul
 
def matrixMul(m1, m2):
Line 4,127 ⟶ 5,499:
sum(map(mul, row, column)),
*m2),
m1)</langsyntaxhighlight>
 
Using list comprehensions, multiplying matrices represented as lists of lists. (Input is not validated):
<langsyntaxhighlight lang="python">def mm(A, B):
return [[sum(x * B[i][col] for i,x in enumerate(row)) for col in range(len(B[0]))] for row in A]</langsyntaxhighlight>
 
Another one, use numpy the most popular array package for python
<langsyntaxhighlight lang="python">
import numpy as np
np.dot(a,b)
#or if a is an array
a.dot(b)</langsyntaxhighlight>
 
=={{header|R}}==
<syntaxhighlight lang ="r">a %*% b</langsyntaxhighlight>
 
=={{header|Racket}}==
{{trans|Scheme}}
 
<langsyntaxhighlight lang="racket">
#lang racket
(define (m-mult m1 m2)
Line 4,154 ⟶ 5,526:
(m-mult '((1 2) (3 4)) '((5 6) (7 8)))
;; -> '((19 22) (43 50))
</syntaxhighlight>
</lang>
 
Alternative:
<langsyntaxhighlight lang="racket">
#lang racket
(require math)
(matrix* (matrix [[1 2] [3 4]]) (matrix [[5 6] [7 8]]))
;; -> (array #[#[19 22] #[43 50]])
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
Line 4,184 ⟶ 5,556:
used on an array to generate all the indexes of the array. We have a way of indicating a range by the infix <tt>..</tt> operator, and you can put a <tt>^</tt> on either end to exclude that endpoint. We found ourselves writing <tt>0 ..^ @a</tt> so often that we made <tt>^@a</tt> a shorthand for that. It's pronounced "upto". The array is evaluated in a numeric context, so it returns the number of elements it contains, which is exactly what you want for the exclusive limit of the range.
 
<syntaxhighlight lang="raku" perl6line>sub mmult(@a,@b) {
my @p;
for ^@a X ^@b[0] -> ($r, $c) {
Line 4,202 ⟶ 5,574:
[ -1/6, 1/4, -1/6, 1/24];
 
.say for mmult(@a,@b);</langsyntaxhighlight>
 
{{out}}
Line 4,216 ⟶ 5,588:
Some people will find this more readable and elegant, and others will, well, not.
 
<syntaxhighlight lang="raku" perl6line>sub mmult(\a,\b) {
[
for ^a -> \r {
Line 4,226 ⟶ 5,598:
}
]
}</langsyntaxhighlight>
 
Here we use Z with an "op" of <tt>*</tt>, which is a zip with multiply. This, along with the <tt>[+]</tt> reduction operator, replaces the inner loop. We chose to split the outer X loop back into two loops to make it convenient to collect each subarray value in <tt>[...]</tt>. It just collects all the returned values from the inner loop and makes an array of them. The outer loop simply returns the outer array.
Line 4,232 ⟶ 5,604:
For conciseness, the above could be written as:
 
<syntaxhighlight lang="raku" perl6line>multi infix:<×> (@A, @B) {
@A.map: -> @a { do [+] @a Z× @B[*;$_] for ^@B[0] }
}</langsyntaxhighlight>
 
Which overloads the built-in <code>×</code> operator for <code>Positional</code> operands. You’ll notice we are using <code>×</code> inside of the definition; since the arguments there are <code>Scalar</code>, it multiplies two numbers. Also, <code>do</code> is an alternative to parenthesising the loop for getting its result.
 
{{works with|Rakudo|2022.07-3}}
 
Here is a more functional version, expressing the product of two matrices as the cross dot product of the first matrix with the transpose of the second :
 
<syntaxhighlight lang="raku" line>sub infix:<·> { [+] @^a Z* @^b }
sub infix:<×>(@A, @B) { (@A X· [Z] @B).rotor(@B) }
</syntaxhighlight>
 
=={{header|Rascal}}==
<langsyntaxhighlight Rascallang="rascal">public rel[real, real, real] matrixMultiplication(rel[real x, real y, real v] matrix1, rel[real x, real y, real v] matrix2){
if (max(matrix1.x) == max(matrix2.y)){
p = {<x1,y1,x2,y2, v1*v2> | <x1,y1,v1> <- matrix1, <x2,y2,v2> <- matrix2};
Line 4,259 ⟶ 5,639:
<1.0,0.0,-51.0>, <1.0,1.0,167.0>, <1.0,2.0,24.0>,
<2.0,0.0,4.0>, <2.0,1.0,-68.0>, <2.0,2.0,-41.0>
};</langsyntaxhighlight>
 
=={{header|REXX}}==
<langsyntaxhighlight lang="rexx">/*REXX program multipliescalculates twothe matricesKronecker together,product displays the matricesof and the resultstwo arbitrary size matrices. */
Signal On syntax
x.=; x.1= 1 2 /*╔═══════════════════════════════════╗*/
x.=0
x.2= 3 4 /*║ As none of the matrix values have ║*/
amat=4X2 1 2 3 x.3=4 5 6 7 8 /*║ a sign, quotesdefine aren'tA needed.matrix size and elements */
bmat=2X3 1 2 3 4 5 6 /* " B " x.4= 7 8 " " " /*╚═══════════════════════════════════╝*/
Call makeMat 'A',amat do r=1 while x.r\=='' /*build theconstruct "A" matrix from X.elements numbers.*/
Call makeMat 'B',bmat /* " do c=1 while x.r\==''; parseB var x.r" a.r.c x.r;" " end /*c*/
If cols.A<>rows.B Then
end /*r*/
Call exit 'Matrices are incompatible for matrix multiplication',
Arows= r - 1 /*adjust the number of rows (DO loop).*/
'cols.A='cols.A'<>rows.B='rows.B
Acols= c - 1 /* " " " " cols " " .*/
Call multMat y.=; /* multiply A x B y.1= 1 2 3 */
Call showMat 'A',amat /* display matrix A y.2= 4 5 6 */
Call showMat 'B',bmat /* do" r=1 while y.r\=='' " B /*build the "B" matrix from Y. numbers.*/
Call showMat 'C',mm /* do" c=1 while y.r\==''; parse var " C y.r b.r.c y.r; end /*c*/
Exit
end /*r*/
/*--------------------------------------------------------------------*/
Brows= r - 1 /*adjust the number of rows (DO loop).*/
makeMat:
Bcols= c - 1 /* " " " " cols " " */
Parse Arg what,size elements /*elements: e.1.1 e.1.2 - e.rows cols*/
w= 0 /*W is max width of an matrix element.*/
Parse Var size rows 'X' cols
c.= 0; do i=1 for Arows /*multiply matrix A and B ───► C */
x.what.shape=rows cols
do j=1 for Bcols
Parse Value rows cols With rows.what cols.what
do k=1 for Acols; c.i.j= c.i.j + a.i.k*b.k.j; w= max(w, length(c.i.j) )
n=0
end /*k*/ /* ↑ */
Do r=1 To rows
end /*j*/ /* └────────◄───────────┐ */
Do c=1 To cols
end /*i*/ /*max width of the matrix elements─►─┘ */
n=n+1
element=word(elements,n)
x.what.r.c=element
End
End
Return
/*--------------------------------------------------------------------*/
multMat:
/* x.C.*.* = x.A.*.* x x.B.*.* */
Do i=1 To rows.A
Do j=1 To cols.B
Do k=1 To cols.A
x.C.i.j=x.C.i.j+x.A.i.k*x.B.k.j
End /*k*/
End /*j*/
End /*i*/
mm=rows.A||'X'||cols.B
Do i=1 To rows.A
Do j=1 To cols.B
mm=mm x.C.i.j
End /*j*/
End /*i*/
Call makeMat 'C',mm
Return
/*--------------------------------------------------------------------*/
showMat:
Parse Arg what,size .
Parse Var size rows 'X' cols
z='+'
b6=left('',6)
Say ''
Say b6 copies('-',7) 'matrix' what copies('-',7)
w=0
Do r=1 To rows
Do c=1 To cols
w=max(w,length(x.what.r.c))
End
End
Say b6 b6 '+'copies('-',cols*(w+1)+1)'+' /* top border */
Do r=1 To rows
line='|' right(x.what.r.1,w) /* element of first colsumn */ /* start with long vertical bar */
Do c=2 To cols /* loop for other columns */
line=line right(x.what.r.c,w) /* append the elements */
End /* c */
Say b6 b6 line '|' /* append a long vertical bar. */
End /* r */
Say b6 b6 '+'copies('-',cols*(w+1)+1)'+' /* bottom border */
Return
exit:
Say arg(1)
Exit
 
Syntax:
call showMat 'A', Arows, Acols /*display matrix A ───► the terminal.*/
Say 'Syntax raised in line' sigl
call showMat 'B', Brows, Bcols /* " " B ───► " " */
Say sourceline(sigl)
call showMat 'C', Arows, Bcols /* " " C ───► " " */
Say 'rc='rc '('errortext(rc)')'
exit /*stick a fork in it, we're all done. */
Say '***** There was a problem!'
/*──────────────────────────────────────────────────────────────────────────────────────*/
Exit</syntaxhighlight>
showMat: parse arg mat,rows,cols; say; say center(mat 'matrix', cols*(w+1) + 9, "─")
do r=1 for rows; _= ' '
do c=1 for cols; _= _ right( value(mat'.'r"."c), w); end; say _
end /*r*/; return</lang>
{{out|output|text=&nbsp; when using the internal default input:}}
<pre>
------- matrix A -------
───A matrix────
1 2 +-----+
3 4 | 1 2 |
5 6 | 3 4 |
7 8 | 5 6 |
| 7 8 |
+-----+
 
------- matrix B -------
─────B matrix─────
1 2 3 +-------+
4 5 6 | 1 2 3 |
| 4 5 6 |
+-------+
 
------- matrix C -------
─────C matrix─────
9 12 15 +----------+
19 26 33 | 9 12 15 |
29 40 51 | 19 26 33 |
39 54 69 | 29 40 51 |
| 39 54 69 |
+----------+
</pre>
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
load "stdlib.ring"
n = 3
Line 4,335 ⟶ 5,769:
see nl
next
</syntaxhighlight>
</lang>
Output:
<pre>
Line 4,341 ⟶ 5,775:
456
789
</pre>
 
=={{header|RPL}}==
The <code>*</code> operator can multiply numbers of any kind together, matrices - and even lists in latest RPL versions.
[[1 2 3][4 5 6]] [[3 1][4 1][5 9]] *
{{out}}
<pre>
1: [[ 26 30 ]
[ 62 63 ]]
</pre>
 
=={{header|Ruby}}==
Using 'matrix' from the standard library:
<langsyntaxhighlight lang="ruby">require 'matrix'
 
Matrix[[1, 2],
[3, 4]] * Matrix[[-3, -8, 3],
[-2, 1, 4]]</langsyntaxhighlight>
{{out}}
Matrix[[-7, -6, 11], [-17, -20, 25]]
 
Version for lists: {{trans|Haskell}}
<langsyntaxhighlight lang="ruby">def matrix_mult(a, b)
a.map do |ar|
b.transpose.map { |bc| ar.zip(bc).map{ |x| x.inject(&:*) }.sum }
end
end</langsyntaxhighlight>
 
=={{header|Rust}}==
<langsyntaxhighlight lang="rust">
struct Matrix {
dat: [[f32; 3]; 3]
Line 4,421 ⟶ 5,864:
}
 
</syntaxhighlight>
</lang>
 
=={{header|S-lang}}==
<langsyntaxhighlight Clang="c">% Matrix multiplication is a built-in with the S-Lang octothorpe operator.
variable A = [1,2,3,4,5,6];
reshape(A, [2,3]); % reshape 1d array to 2 rows, 3 columns
Line 4,439 ⟶ 5,882:
reshape(B, [2,3]);
printf("\nA * B is %S (with reshaped B to match A)\n", A*B);
print(A*B);</langsyntaxhighlight>
 
{{out}}
Line 4,464 ⟶ 5,907:
Assuming an array of arrays representation:
 
<langsyntaxhighlight lang="scala">def mult[A](a: Array[Array[A]], b: Array[Array[A]])(implicit n: Numeric[A]) = {
import n._
for (row <- a)
yield for(col <- b.transpose)
yield row zip col map Function.tupled(_*_) reduceLeft (_+_)
}</langsyntaxhighlight>
 
For any subclass of <code>Seq</code> (which does not include Java-specific arrays):
 
<langsyntaxhighlight lang="scala">def mult[A, CC[X] <: Seq[X], DD[Y] <: Seq[Y]](a: CC[DD[A]], b: CC[DD[A]])
(implicit n: Numeric[A]): CC[DD[A]] = {
import n._
Line 4,479 ⟶ 5,922:
yield for(col <- b.transpose)
yield row zip col map Function.tupled(_*_) reduceLeft (_+_)
}</langsyntaxhighlight>
 
Examples:
Line 4,509 ⟶ 5,952:
{{trans|Common Lisp}}
This version works on lists of lists:
<langsyntaxhighlight lang="scheme">(define (matrix-multiply matrix1 matrix2)
(map
(lambda (row)
Line 4,516 ⟶ 5,959:
(apply + (map * row column)))
matrix2))
matrix1))</langsyntaxhighlight>
 
> (matrix-multiply '((1 2) (3 4)) '((-3 -8 3) (-2 1 4)))
Line 4,522 ⟶ 5,965:
 
=={{header|Seed7}}==
<langsyntaxhighlight lang="seed7">const type: matrix is array array float;
 
const func matrix: (in matrix: left) * (in matrix: right) is func
Line 4,547 ⟶ 5,990:
end for;
end if;
end func;</langsyntaxhighlight>
 
Original source: [http://seed7.sourceforge.net/algorith/math.htm#mmult]
Line 4,558 ⟶ 6,001:
The SequenceL definition mirrors that definition more or less exactly:
 
<langsyntaxhighlight lang="sequencel">matmul(A(2), B(2)) [i,j] :=
let k := 1...size(B);
in sum( A[i,k] * B[k,j] );
Line 4,569 ⟶ 6,012:
[-2, 1, 4]];
test := matmul(a, b);</langsyntaxhighlight>
 
It can be written a little more simply using the all keyword:
 
<langsyntaxhighlight lang="sequencel">matmul(A(2), B(2)) [i,j] := sum( A[i,all] * B[all,j] );</langsyntaxhighlight>
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func matrix_multi(a, b) {
var m = [[]]
for r in ^a {
Line 4,602 ⟶ 6,045:
for line in matrix_multi(a, b) {
say line.map{|i|'%3d' % i }.join(', ')
}</langsyntaxhighlight>
{{out}}
<pre> 9, 12, 15
Line 4,613 ⟶ 6,056:
{{works with|OpenAxiom}}
{{works with|Axiom}}
<langsyntaxhighlight SPADlang="spad">(1) -> A:=matrix [[1,2],[3,4],[5,6],[7,8]]
 
+1 2+
Line 4,638 ⟶ 6,081:
| |
+39 54 69+
Type: Matrix(Integer)</langsyntaxhighlight>
 
Domain:[http://fricas.github.io/api/Matrix.html?highlight=matrix Matrix(R)]
 
=={{header|SQL}}==
<langsyntaxhighlight lang="sql">CREATE TABLE a (x integer, y integer, e real);
CREATE TABLE b (x integer, y integer, e real);
 
Line 4,662 ⟶ 6,105:
INTO TABLE c
FROM a AS lhs, b AS rhs
WHERE lhs.x = 0 AND rhs.y = 0;</langsyntaxhighlight>
 
=={{header|Standard ML}}==
<langsyntaxhighlight lang="sml">structure IMatrix = struct
fun dot(x,y) = Vector.foldli (fn (i,xi,agg) => agg+xi*Vector.sub(y,i)) 0 x
fun x*y =
Line 4,688 ⟶ 6,131:
in
toList (m1*m2)
end;</langsyntaxhighlight>
'''Output:'''
<langsyntaxhighlight lang="sml">val it = [[~7,~6,11],[~17,~20,25]] : int list list</langsyntaxhighlight>
 
=={{header|Stata}}==
=== Stata matrices ===
<langsyntaxhighlight lang="stata">. mat a=1,2,3\4,5,6
. mat b=1,1,0,0\1,0,0,1\0,0,1,1
. mat c=a*b
Line 4,702 ⟶ 6,145:
c1 c2 c3 c4
r1 3 1 3 5
r2 9 4 6 11</langsyntaxhighlight>
=== Mata ===
<langsyntaxhighlight lang="stata">: a=1,2,3\4,5,6
: b=1,1,0,0\1,0,0,1\0,0,1,1
: a*b
Line 4,711 ⟶ 6,154:
1 | 3 1 3 5 |
2 | 9 4 6 11 |
+---------------------+</langsyntaxhighlight>
 
=={{header|Swift}}==
 
<langsyntaxhighlight lang="swift">@inlinable
public func matrixMult<T: Numeric>(_ m1: [[T]], _ m2: [[T]]) -> [[T]] {
let n = m1[0].count
Line 4,773 ⟶ 6,216:
let m3 = matrixMult(m1, m2)
 
printMatrix(m3)</langsyntaxhighlight>
 
{{out}}
Line 4,781 ⟶ 6,224:
 
=={{header|Tailspin}}==
<langsyntaxhighlight lang="tailspin">
operator (A matmul B)
$A -> \[i](
Line 4,816 ⟶ 6,259:
' -> !OUT::write
($a matmul $b) -> printMatrix&{w:2} -> !OUT::write
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 4,835 ⟶ 6,278:
=={{header|Tcl}}==
{{works with|Tcl|8.5}}
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
namespace path ::tcl::mathop
proc matrix_multiply {a b} {
Line 4,854 ⟶ 6,297:
}
return $temp
}</langsyntaxhighlight>
Using the <code>print_matrix</code> procedure defined in [[Matrix Transpose#Tcl]]
<pre>% print_matrix [matrix_multiply {{1 2} {3 4}} {{-3 -8 3} {-2 1 4}}]
Line 4,862 ⟶ 6,305:
=={{header|TI-83 BASIC}}==
Store your matrices in <tt>[A]</tt> and <tt>[B]</tt>.
<syntaxhighlight lang ="ti83b">Disp [A]*[B]</langsyntaxhighlight>
An error will show if the matrices have invalid dimensions for multiplication.
<br><br>'''Other way:''' enter directly your matrices:
<langsyntaxhighlight lang="ti83b">[[1,2][3,4][5,6][7,8]]*[[1,2,3][4,5,6]]</langsyntaxhighlight>
{{out}}
[[9 12 15]
Line 4,876 ⟶ 6,319:
{{trans|Mathematica}}
 
<langsyntaxhighlight lang="ti89b">[1,2; 3,4; 5,6; 7,8] → m1
[1,2,3; 4,5,6] → m2
m1 * m2</langsyntaxhighlight>
 
Or without the variables:
 
<langsyntaxhighlight lang="ti89b">[1,2; 3,4; 5,6; 7,8] * [1,2,3; 4,5,6]</langsyntaxhighlight>
 
The result (without prettyprinting) is:
 
<langsyntaxhighlight lang="ti89b">[[9,12,15][19,26,33][29,40,51][39,54,69]]</langsyntaxhighlight>
 
=={{header|Transd}}==
<syntaxhighlight lang="scheme">#lang transd
 
 
MainModule: {
_start: (λ (with n 5
A (for i in Range(n) project (for k in Range(n) project k))
B (for i in Range(n) project (for k in Range(n) project (- n k)))
C (for i in Range(n) project (for k in Range(n) project 0))
 
(for i in Range( n ) do
(for j in Range( n ) do
(for k in Range( n ) do
(+= (get (get C i) j) (* (get (get A i) k) (get (get B k) j)))
)))
(lout C))
)
}</syntaxhighlight>{{out}}
<pre>
[[50, 40, 30, 20, 10],
[50, 40, 30, 20, 10],
[50, 40, 30, 20, 10],
[50, 40, 30, 20, 10],
[50, 40, 30, 20, 10]]
</pre>
 
=={{header|UNIX Shell}}==
<langsyntaxhighlight lang="bash">
#!/bin/bash
 
Line 5,073 ⟶ 6,542:
echo
echo
</syntaxhighlight>
</lang>
 
=={{header|Ursala}}==
Line 5,081 ⟶ 6,550:
the built in rational number type.
 
<langsyntaxhighlight Ursalalang="ursala">#import rat
 
a =
Line 5,103 ⟶ 6,572:
#cast %qLL
 
test = mmult(a,b)</langsyntaxhighlight>
{{out}}
<pre><
Line 5,113 ⟶ 6,582:
=={{header|VBA}}==
Using Excel. The resulting matrix should be smaller than 5461 elements.
<langsyntaxhighlight lang="vb">Function matrix_multiplication(a As Variant, b As Variant) As Variant
matrix_multiplication = WorksheetFunction.MMult(a, b)
End Function</langsyntaxhighlight>
 
=={{header|VBScript}}==
<syntaxhighlight lang="vb">
<lang vb>
Dim matrix1(2,2)
matrix1(0,0) = 3 : matrix1(0,1) = 7 : matrix1(0,2) = 4
Line 5,138 ⟶ 6,607:
Next
End Sub
</syntaxhighlight>
</lang>
 
{{Out}}
Line 5,148 ⟶ 6,617:
 
=={{header|Visual FoxPro}}==
<langsyntaxhighlight lang="vfp">
LOCAL ARRAY a[4,2], b[2,3], c[4,3]
CLOSE DATABASES ALL
Line 5,191 ⟶ 6,660:
ENDIF
ENDPROC
</syntaxhighlight>
</lang>
 
=={{header|Wren}}==
{{libheader|Wren-matrix}}
{{libheader|Wren-fmt}}
<langsyntaxhighlight ecmascriptlang="wren">import "./matrix" for Matrix
import "./fmt" for Fmt
 
var a = Matrix.new([
Line 5,216 ⟶ 6,685:
Fmt.mprint(b, 2, 0)
System.print("\nMatrix A x B:\n")
Fmt.mprint(a * b, 3, 0)</langsyntaxhighlight>
 
{{out}}
Line 5,241 ⟶ 6,710:
 
=={{header|XPL0}}==
<langsyntaxhighlight XPL0lang="xpl0">proc Mat4x1Mul(M, V); \Multiply matrix M times column vector V
real M, \4x4 matrix [M] * [V] -> [V]
V; \column vector
Line 5,267 ⟶ 6,736:
N(3,C):= W(3,C);
];
];</langsyntaxhighlight>
 
=={{header|XSLT 1.0}}==
With input document ...
 
<langsyntaxhighlight lang="xml"><?xml-stylesheet href="matmul.templ.xsl" type="text/xsl"?>
<mult>
<A>
Line 5,284 ⟶ 6,753:
<r><c>4</c><c>5</c><c>6</c></r>
</B>
</mult></langsyntaxhighlight>
 
... and this referenced stylesheet ...
 
<langsyntaxhighlight lang="xml"><xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
Line 5,364 ⟶ 6,833:
</xsl:template>
 
</xsl:stylesheet></langsyntaxhighlight>
{{out}} (in a browser):
Line 5,379 ⟶ 6,848:
 
A slightly smaller version of above stylesheet making use of (Non-"XSLT 1.0") EXSLT functions can be founde here: [[https://www.ibm.com/developerworks/mydeveloperworks/blogs/HermannSW/entry/matrix_multiplication30]]
 
 
=={{header|Yabasic}}==
<syntaxhighlight lang="yabasic">dim a(4, 2)
a(0, 0) = 1 : a(0, 1) = 2
a(1, 0) = 3 : a(1, 1) = 4
a(2, 0) = 5 : a(2, 1) = 6
a(3, 0) = 7 : a(3, 1) = 8
dim b(2, 3)
b(0, 0) = 1 : b(0, 1) = 2 : b(0, 2) = 3
b(1, 0) = 4 : b(1, 1) = 5 : b(1, 2) = 6
dim prod(arraysize(a(),1), arraysize(b(),2))
 
if (arraysize(a(),2) = arraysize(b(),1)) then
for i = 0 to arraysize(a(),1)
for j = 0 to arraysize(b(),2)
for k = 0 to arraysize(a(),2)
prod(i, j) = prod(i, j) + (a(i, k) * b(k, j))
next k
next j
next i
 
for i = 0 to arraysize(prod(),1)-1
for j = 0 to arraysize(prod(),2)-1
print prod(i, j),
next j
print
next i
else
print "invalid dimensions"
end if
end</syntaxhighlight>
 
 
=={{header|zkl}}==
Using the GNU Scientific Library:
<langsyntaxhighlight lang="zkl">var [const] GSL=Import("zklGSL"); // libGSL (GNU Scientific Library)
A:=GSL.Matrix(4,2).set(1,2, 3,4, 5,6, 7,8);
B:=GSL.Matrix(2,3).set(1,2,3, 4,5,6);
(A*B).format().println(); // creates a new matrix</langsyntaxhighlight>
{{out}}
<pre>
Line 5,395 ⟶ 6,897:
Or, using lists:
{{trans|BASIC}}
<langsyntaxhighlight lang="zkl">fcn matMult(a,b){
n,m,p:=a[0].len(),a.len(),b[0].len();
ans:=(0).pump(m,List().write, (0).pump(p,List,0).copy); // matrix of zeros
foreach i,j,k in (m,p,n){ ans[i][j]+=a[i][k]*b[k][j]; }
ans
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">a:=L( L(1,2,), L(3,4,), L(5,6,), L(7,8) );
b:=L( L(1,2,3,), L(4,5,6) );
printM(matMult(a,b));
 
fcn printM(m){ m.pump(Console.println,rowFmt) }
fcn rowFmt(row){ ("%4d "*row.len()).fmt(row.xplode()) }</langsyntaxhighlight>
{{out}}
<pre>
Line 5,416 ⟶ 6,918:
 
=={{header|zonnon}}==
<langsyntaxhighlight lang="zonnon">
module MatrixOps;
type
Line 5,446 ⟶ 6,948:
Multiplication;
end MatrixOps.
</syntaxhighlight>
</lang>
 
=={{header|ZPL}}==
<syntaxhighlight lang="zpl">
<lang ZPL>
program matmultSUMMA;
 
Line 5,591 ⟶ 7,093:
return retval;
end;
</syntaxhighlight>
</lang>
1,969

edits