Matrix Multiplication Visualization
Two random 4x4 matrices have been created below, and their product is shown. Highlighted in red are a column from the first matrix and a row from the second matrix, whose product is the red entry in the final matrix.
Drag the sliders to change which row and column are highlighted. The red equations at the bottom show how the row and column were multiplied to yield the final result.
Created by Kevin Cox at Bentley University
def Mwithredrow (myMatrix, R): A00 = latex(myMatrix[0,0]) A01 = latex(myMatrix[0,1]) A02 = latex(myMatrix[0,2]) A03 = latex(myMatrix[0,3]) A10 = latex(myMatrix[1,0]) A11 = latex(myMatrix[1,1]) A12 = latex(myMatrix[1,2]) A13 = latex(myMatrix[1,3]) A20 = latex(myMatrix[2,0]) A21 = latex(myMatrix[2,1]) A22 = latex(myMatrix[2,2]) A23 = latex(myMatrix[2,3]) A30 = latex(myMatrix[3,0]) A31 = latex(myMatrix[3,1]) A32 = latex(myMatrix[3,2]) A33 = latex(myMatrix[3,3]) if (R == 1): A00 = "\\color{red}{" + A00 + "}" A01 = "\\color{red}{" + A01 + "}" A02 = "\\color{red}{" + A02 + "}" A03 = "\\color{red}{" + A03 + "}" if (R == 2): A10 = "\\color{red}{" + A10 + "}" A11 = "\\color{red}{" + A11 + "}" A12 = "\\color{red}{" + A12 + "}" A13 = "\\color{red}{" + A13 + "}" if (R == 3): A20 = "\\color{red}{" + A20 + "}" A21 = "\\color{red}{" + A21 + "}" A22 = "\\color{red}{" + A22 + "}" A23 = "\\color{red}{" + A23 + "}" if (R == 4): A30 = "\\color{red}{" + A30 + "}" A31 = "\\color{red}{" + A31 + "}" A32 = "\\color{red}{" + A32 + "}" A33 = "\\color{red}{" + A33 + "}" return "\\left[\\begin{array}{rrrr}" + A00 + "&" + A01 + "&" + A02 + "&" + A03 + "\\\\" + A10 + "&" + A11 + "&" + A12 + "&" + A13 + "\\\\" + A20 + "&" + A21 + "&" + A22 + "&" + A23 + "\\\\" + A30 + "&" + A31 + "&" + A32 + "&" + A33 + "\\end{array}\\right]" def Mwithredcolumn (myMatrix, C): A00 = latex(myMatrix[0,0]) A01 = latex(myMatrix[0,1]) A02 = latex(myMatrix[0,2]) A03 = latex(myMatrix[0,3]) A10 = latex(myMatrix[1,0]) A11 = latex(myMatrix[1,1]) A12 = latex(myMatrix[1,2]) A13 = latex(myMatrix[1,3]) A20 = latex(myMatrix[2,0]) A21 = latex(myMatrix[2,1]) A22 = latex(myMatrix[2,2]) A23 = latex(myMatrix[2,3]) A30 = latex(myMatrix[3,0]) A31 = latex(myMatrix[3,1]) A32 = latex(myMatrix[3,2]) A33 = latex(myMatrix[3,3]) if (C == 1): A00 = "\\color{red}{" + A00 + "}" A10 = "\\color{red}{" + A10 + "}" A20 = "\\color{red}{" + A20 + "}" A30 = "\\color{red}{" + A30 + "}" if (C == 2): A01 = "\\color{red}{" + A01 + "}" A11 = "\\color{red}{" + A11 + "}" A21 = "\\color{red}{" + A21 + "}" A31 = "\\color{red}{" + A31 + "}" if (C == 3): A02 = "\\color{red}{" + A02 + "}" A12 = "\\color{red}{" + A12 + "}" A22 = "\\color{red}{" + A22 + "}" A32 = "\\color{red}{" + A32 + "}" if (C == 4): A03 = "\\color{red}{" + A03 + "}" A13 = "\\color{red}{" + A13 + "}" A23 = "\\color{red}{" + A23 + "}" A33 = "\\color{red}{" + A33 + "}" return "\\left[\\begin{array}{rrrr}" + A00 + "&" + A01 + "&" + A02 + "&" + A03 + "\\\\" + A10 + "&" + A11 + "&" + A12 + "&" + A13 + "\\\\" + A20 + "&" + A21 + "&" + A22 + "&" + A23 + "\\\\" + A30 + "&" + A31 + "&" + A32 + "&" + A33 + "\\end{array}\\right]" def Mwithredentry (myMatrix, R, C): A00 = latex(myMatrix[0,0]) A01 = latex(myMatrix[0,1]) A02 = latex(myMatrix[0,2]) A03 = latex(myMatrix[0,3]) A10 = latex(myMatrix[1,0]) A11 = latex(myMatrix[1,1]) A12 = latex(myMatrix[1,2]) A13 = latex(myMatrix[1,3]) A20 = latex(myMatrix[2,0]) A21 = latex(myMatrix[2,1]) A22 = latex(myMatrix[2,2]) A23 = latex(myMatrix[2,3]) A30 = latex(myMatrix[3,0]) A31 = latex(myMatrix[3,1]) A32 = latex(myMatrix[3,2]) A33 = latex(myMatrix[3,3]) if (R == 1) and (C == 1): A00 = "\\color{red}{" + A00 + "}" if (R == 1) and (C == 2): A01 = "\\color{red}{" + A01 + "}" if (R == 1) and (C == 3): A02 = "\\color{red}{" + A02 + "}" if (R == 1) and (C == 4): A03 = "\\color{red}{" + A03 + "}" if (R == 2) and (C == 1): A10 = "\\color{red}{" + A10 + "}" if (R == 2) and (C == 2): A11 = "\\color{red}{" + A11 + "}" if (R == 2) and (C == 3): A12 = "\\color{red}{" + A12 + "}" if (R == 2) and (C == 4): A13 = "\\color{red}{" + A13 + "}" if (R == 3) and (C == 1): A20 = "\\color{red}{" + A20 + "}" if (R == 3) and (C == 2): A21 = "\\color{red}{" + A21 + "}" if (R == 3) and (C == 3): A22 = "\\color{red}{" + A22 + "}" if (R == 3) and (C == 4): A23 = "\\color{red}{" + A23 + "}" if (R == 4) and (C == 1): A30 = "\\color{red}{" + A30 + "}" if (R == 4) and (C == 2): A31 = "\\color{red}{" + A31 + "}" if (R == 4) and (C == 3): A32 = "\\color{red}{" + A32 + "}" if (R == 4) and (C == 4): A33 = "\\color{red}{" + A33 + "}" return "\\left[\\begin{array}{rrrr}" + A00 + "&" + A01 + "&" + A02 + "&" + A03 + "\\\\" + A10 + "&" + A11 + "&" + A12 + "&" + A13 + "\\\\" + A20 + "&" + A21 + "&" + A22 + "&" + A23 + "\\\\" + A30 + "&" + A31 + "&" + A32 + "&" + A33 + "\\end{array}\\right]" A = random_matrix(ZZ,4,4) B = random_matrix(ZZ,4,4) @interact def f(row=slider([1,2,3,4]),column=slider([1,2,3,4])): global A,B C=A*B h = A.row(row-1) b = B.column(column-1) D=h*b hlatex = latex(matrix(h)).replace("(","[").replace(")","]") t = column_matrix(B.column(column-1)) tlatex = latex(t).replace("(","[").replace(")","]") part0 = "("+latex(h[0])+")("+latex(b[0])+")" part0answer = latex(h[0] * b[0]) part1 = "("+latex(h[1])+")("+latex(b[1])+")" part1answer = latex(h[1] * b[1]) part2 = "("+latex(h[2])+")("+latex(b[2])+")" part2answer = latex(h[2] * b[2]) part3 = "("+latex(h[3])+")("+latex(b[3])+")" part3answer = latex(h[3] * b[3]) pretty_print(html("$" + Mwithredrow(A, row) + Mwithredcolumn(B, column) + "=" + Mwithredentry(C, row, column) + "$")) pretty_print(html("$"+"$")) pretty_print(html("$\\color{red}{"+hlatex+tlatex+"="+part0+"+"+part1+"+"+part2+"+"+part3+"="+part0answer+"+"+part1answer+"+"+part2answer+"+"+part3answer+"="+latex(D)+"}$"))