Почему эта программа не следует правилам матриц? - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть следующий код, и я не могу доказать теоремы об AB! = BA и далее до числа 8. Я попытался умножить матрицы с помощью онлайн-калькуляторов и дал тот же результат, который дала мне моя программа.

Matrix a = new Matrix(new int[][]{{1,2},{4,3}});
Matrix b = new Matrix(new int[][]{{3,2},{4,5}});
Matrix c = new Matrix(new int[][]{{2,2},{-1,-1}});

System.out.print("1. (A^T)^T=A \t\t = ");
System.out.println(a.transpose().transpose().equals(a));

System.out.print("2. (A+B)^T = A^T+B^T     = ");
Matrix added = a.add(b).transpose();
System.out.println(added.equals(a.transpose().add(b.transpose())));

System.out.print("3. (2A)^T = 2A^T \t = ");
System.out.println(a.scalarMult(2).transpose().equals(a.transpose().scalarMult(2)));

System.out.print("4. (AB)^T = B^T A^T \t = ");
Matrix mult = a.transpose().mult(b.transpose());
System.out.println(mult.equals(a.mult(b).transpose()));


System.out.println("5. AB != BA  \t\t = " + a.mult(b).equals(b.mult(a))); //though some cases AB != BA, this case they are equal? 
//I tried 2 different calculators for matricies online and got the same results


System.out.println("6. A(BC) = (AB)C \t = " + b.mult(c).mult(a).equals(a.mult(b).mult(c)));

System.out.println("7. A(B+C) = AB + AC =    = " + (a.add(b)).mult(c).equals( (a.mult(c)).mult(b.mult(c))));

System.out.println("8. (2A)B = 2(AB) = A(2B) = " + (a.add(b).mult(c).equals(a.mult(b).add(b.mult(c)))));

1 Ответ

3 голосов
/ 09 февраля 2020

Неверно, что AB и BA ВСЕГДА будут давать разные результаты. Правило состоит в том, что умножение матриц некоммутативно, но не исключительно некоммутативно. Это означает, что, хотя в некоторых случаях, например, в вашей программе, A B и B A дают одинаковый результат, это не всегда так. И обычно это не так, у вас просто есть образцы матриц, которые делают это.

Правило гласит: "A (B C) = (AB) C", что является ассоциативное свойство умножения матриц. Но код, который у вас есть, по сути делает "BCA = AB C". Поскольку умножение матриц не является коммутативным, вам нужно поставить «A» слева от «(B C)» следующим образом: a.mult(b.mult(c))

a.mult(b.mult(c)).equals((a.mult(b)).mult(c))

Правило гласит: «A (B + C) = AB + A C», что является распределительным свойством. Ваш код делает "(A + B) C = (A C) (B C)". Это должно быть слегка переписано.

Правило гласит: "(2A) B = 2 (AB) = A (2B)". Ваш код делает "(A + B) C = AB + B C". Этот код не связан с этим правилом и выглядит как число 7.

...