Задача
Напишите класс для хранения матриц и реализуйте основные операции работы с ними.
Тесты
№ | Операция | Входная матрица А | Входная матрица В | Результат |
1 | Транспони-рования | 33 34 12 33 19 10 12 14 17 84 24 51 43 71 21 |
— | 33 33 12 84 43 34 19 14 24 71 12 10 17 51 21 |
2 | Сложения | -1 1 -1 1 -1 1 -1 1 -1 |
1 -1 1 -1 1 -1 1 -1 1 |
0 0 0 0 0 0 0 0 0 |
3 | Вычитания | -1 1 -1 1 -1 1 -1 1 -1 |
1 -1 1 -1 1 -1 1 -1 1 |
-2 2 -2 2 -2 2 -2 2 -2 |
4 | Умножения | 33 34 12 33 19 10 12 14 17 84 24 51 43 71 21 |
10 11 34 55 33 45 17 81 45 63 12 16 |
1992 2649 1844 4761 1407 1848 1565 3514 1347 1833 850 2066 3927 5217 3876 7380 3718 4991 2921 8452 |
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
class Matrix { int n, m; int[][] mainMatrix; public Matrix(int n, int m) { this.n = n; this.m = m; this.mainMatrix = new int[this.n][this.m]; } public Matrix(int [][] paramMatrix) { this.n = paramMatrix.length; this.m = paramMatrix[0].length; this.mainMatrix = paramMatrix; } public int getElement(int n, int m) { return this.mainMatrix[n][m]; } public void setElement(int n, int m, int value) { this.mainMatrix[n][m] = value; } public int getVerticalLength() { return this.mainMatrix.length; } public int getHorizontalLength() { return this.mainMatrix[0].length; } public void fillRandomValues() { Random rand = new Random(); for(int i = 0; i < this.n; i++) { for(int j = 0; j < this.m; j++) { this.mainMatrix[i][j] = rand.nextInt(100); } } } public void displayMatrix() { for(int i = 0; i < this.n; i++) { for(int j = 0; j < this.m; j++) { System.out.print(this.mainMatrix[i][j] + " "); } System.out.println(); } } public static int[][] transpone(int[][] paramMatrix) { int[][] tmpMatrix = new int[paramMatrix[0].length][paramMatrix.length]; for(int i = 0; i < paramMatrix[0].length; i++) { for(int j = 0; j < paramMatrix.length; j++) { tmpMatrix[i][j] = paramMatrix[j][i]; } } return tmpMatrix; } public static Matrix transpone(Matrix paramMatrix) { Matrix tmpMatrix = new Matrix(paramMatrix.m, paramMatrix.n); for(int i = 0; i < paramMatrix.m; i++) { for(int j = 0; j < paramMatrix.n; j++) { tmpMatrix.setElement(i, j, paramMatrix.getElement(j, i)); } } return tmpMatrix; } public static Matrix add(Matrix first, Matrix second) throws NotEqualLengthsOfMatrixException { if(first.getVerticalLength() != second.getVerticalLength() || first.getHorizontalLength() != second.getHorizontalLength()) { throw new NotEqualLengthsOfMatrixException(); } else { Matrix tmpMatrix = new Matrix(first.getVerticalLength(), second.getHorizontalLength()); for (int i = 0; i < tmpMatrix.getHorizontalLength(); i++) { for(int j = 0; j < tmpMatrix.getVerticalLength(); j++){ tmpMatrix.setElement(i, j, first.getElement(i, j) + second.getElement(i, j)); } } return tmpMatrix; } } public static Matrix subtract (Matrix first, Matrix second) throws NotEqualLengthsOfMatrixException { if(first.getVerticalLength() != second.getVerticalLength() || first.getHorizontalLength() != second.getHorizontalLength()) throw new NotEqualLengthsOfMatrixException(); else { Matrix tmpMatrix = new Matrix(first.getVerticalLength(), second.getHorizontalLength()); for (int i = 0; i < tmpMatrix.getHorizontalLength(); i++) { for(int j = 0; j < tmpMatrix.getVerticalLength(); j++){ tmpMatrix.setElement(i, j, first.getElement(i, j) - second.getElement(i, j)); } } return tmpMatrix; } } public static Matrix multiply (Matrix first, Matrix second) throws NotEqualLengthsOfMatrixException { if(first.getHorizontalLength() != second.getVerticalLength()) throw new NotEqualLengthsOfMatrixException(); else { Matrix tmpMatrix; int n = first.getVerticalLength(); int m = second.getHorizontalLength(); int o = second.getVerticalLength(); int[][] tmpArr = new int[n][m]; for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ for (int k = 0; k < o; k++) { tmpArr[i][j] += first.getElement(i, k) * second.getElement(k, j); } } } tmpMatrix = new Matrix(tmpArr); return tmpMatrix; } } } class NotEqualLengthsOfMatrixException extends Exception {} class MatrixMain { public static void main(String[] args) throws java.lang.Exception { //int[][] A = {{-1, 1, -1}, {1, -1, 1}, {-1, 1, -1}}; //int[][] B = {{1, -1, 1}, {-1, 1, -1}, {1, -1, 1}}; int[][] A = {{33,34,12}, {33,19,10}, {12,14,17}, {84,24,51}, {43,71,21}}; int[][] B = {{10,11,34,55}, {33,45,17,81}, {45,63,12,16}}; Matrix x = new Matrix(A); Matrix y = new Matrix(B); x.displayMatrix(); y.displayMatrix(); Matrix mM = Matrix.multiply(x, y); mM.displayMatrix(); } } |
Пояснения
Класс Matrix имеет следующие поля: n, m — размеры основной матрицы, и сама матрица mainMatrix , представлена в виде двумерного массива целочисленного типа. Также данный класс имеет два конструктора: первый из которых принимает как параметры размеры создаваемой матрицы public Matrix(int n, int m) , второй же принимает как параметр двумерный массив(матрицу) public Matrix(int [][] paramMatrix) .
Данный класс имеет следующие методы:
- public int getElement(int n, int m) — метод для получения элемента матрицы по индексам;
- public void setElement(int n, int m, int value) — метод задания элемента по индексам;
- public int getVerticalLength() — метод получения количества строк в матрице;
- public int getHorizontalLength() — метод получения количества столбцов в матрице;
- public void fillRandomValues() — метод заполнения матрицы рандомными значениями;
- public void displayMatrix() — метод вывода матрицы;
- public static int[][] transpone(int[][] paramMatrix) — метод транспонирования матрицы, с двумерным массивом как параметр;
- public static Matrix transpone(Matrix paramMatrix) — метод транспонирования матрицы, с объектом класса Matrix , как параметр;
- public static Matrix add(Matrix first, Matrix second) — метод нахождения суммы двух матриц;
- public static Matrix subtract (Matrix first, Matrix second) — метод вычитания одной матрицы из другой;
- public static Matrix multiply (Matrix first, Matrix second) — метод произведения двух матриц.
Для последних трех методов был написан псевдокласс NotEqualLengthsOfMatrixException наследник класса Exception , чтобы при несовпадении размеров заданных матриц генерировать исключительную ситуацию.
А что это такое интересное Вы сделали?
Решили сделать альтернативную версию работы Иры Литвиненко?
Действительно похоже. Как-то я упустил момент проверки наличия данной задачи на сайте по запросу на английском языке, запросы «класс матрица», «класс матрицы» результатов не дали. Моя ошибка. Исправлюсь.