public class Matriseoperasjoner { public int[][] multipliser(int[][] matrise1, int[][] matrise2) { // invariant1 --> rekkef?lgen p? matrisene har noe ? si int rader1 = matrise1.length; int kolonner1 = matrise1[0].length; int rader2 = matrise2.length; int kolonner2 = matrise2[0].length; // invariant2 --> antall kolonner i matrise1 m? v?re lik antall rader i matrise2 --> f?rbetingelse for algoritmen if (kolonner1 != rader2) { throw new IllegalArgumentException("Dimensjonene til matrisene er ikke kompatible for matrisemultiplikasjon. De har dimensjonene: " + rader1 + ", " + kolonner1 + " og " + rader2 + ", " + kolonner2); } // invariant2 "holder" // invariant3 --> resultatmatrisen vil ha f?lgende dimensjoner: antall rader == rader1, antal kolonner == kolonner2 int[][] resultat = new int[rader1][kolonner2]; for (int i = 0; i < rader1; i++) { for (int j = 0; j < kolonner2; j++) { // invariant4 --> l?kkeinvariant, "k" vil til enhver tid representere antall kolonner som er igjen i matrise1 og antall rader som er igjen i matrise2, fordi de har lik st?rrelse for (int k = 0; k < kolonner1; k++) { resultat[i][j] += matrise1[i][k] * matrise2[k][j]; } } } // invariant5 --> "etterbetingelsen" til algoritmen er at den returnerer en matrise med formen/dimensjonene rader1 x kolonner2, hvor hvert element vil representere summen av produktene av de korresponderende elementene fra begge matriser return resultat; } public int[][] transponer(int[][] matrise) { int rader = matrise.length; int kolonner = matrise[0].length; // invariant1 --> antall rader i den transponerte matrisen vil v?re lik antall kolonner i den originale matrisen, og motsatt int[][] transponert = new int[kolonner][rader]; for (int i = 0; i < rader; i++) { for (int j = 0; j < kolonner; j++) { // invariant2 --> hver rad blir "rotert" 90 grader til venstre transponert[j][i] = matrise[i][j]; } } //invariant3 --> "etterbetingelsen" for algoritmen vil v?re at den alltid returnerer en matrise av formen kolonner x rader return transponert; } }