- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
public class Matrix {
private float matrix[][];
private int dim;
public Matrix(int dim) {
this.dim = dim;
this.matrix = new float[dim][dim];
}
public void productOfTwo(Matrix src, Matrix dest) {
if (src.dim == this.dim) {
dest.dim = this.dim;
Matrix[] temp = new Matrix[this.dim];
for (int i = 0; i < this.dim; i++) {
temp[i] = new Matrix(this.dim);
}
for (int i = 0; i < this.dim; i++) {
for (int j = 0; j < this.dim; j++) {
for (int k = 0; k < this.dim; k++) {
temp[k].matrix[i][j] = this.matrix[i][k] * src.matrix[k][j];
}
}
}
for (int i = 0; i < this.dim; i++) {
dest.sum(temp[i]);
}
} else {
System.out.println(" An error occured: Dimensions of matrices do not match");
}
}
public float findDet() {
if (this.dim == 1) {
return this.matrix[0][0];
} else if (this.dim == 2) {
return this.matrix[0][0] * this.matrix[1][1] - this.matrix[0][1] * this.matrix[1][0];
} else {
float result = 0;
Matrix minor = new Matrix(this.dim - 1);
for (int i = 0; i < this.dim; i++) {
for (int j = 1; j < this.dim; j++) {
System.arraycopy(this.matrix[j], 0, minor.matrix[j - 1], 0, i);
System.arraycopy(this.matrix[j], i + 1, minor.matrix[j - 1], i, this.dim - (i + 1));
}
result += Math.pow(-1, i) * this.matrix[0][i] * minor.findDet();
}
return result;
}
}
Всем доброго времени суток! Прошу к Вашему вниманию алгоритм нахождения произведения двух матриц(умножаем слева направо) и нахождения детерминанта разложением по столбцу(рекурсия). Прошу оценить, по всей строгости.
Заранее спасибо!
RaZeR 24.07.2011 22:25 # +6
У нас тут говнокод, а не бюро советов.
SmackMyBitchUp 25.07.2011 02:21 # −1
bugmenot 24.07.2011 22:38 # +5
РАК.
Lure Of Chaos 25.07.2011 00:30 # −1
roman-kashitsyn 24.07.2011 23:00 # 0
1. float. no comments.
2.
>public void productOfTwo(Matrix src, Matrix dest)
Вызов этого метода изменяет состояние dest. Здесь просто напрашивается статический фабричный метод, порождающий новую матрицу, либо публичный метод, принимающий на вход одну матрицу и возвращающий новую, типа
3.
> } else {
> System.out.println(" An error occured: Dimensions of matrices do not match");>
> }
Это вообще п****ц. Надо кидать эксепшн, а не тихонько писать в вывод сообщение.
4. Алгоритмы - гавно, если, конечно, размер матриц не 3х3.
zooz13 24.07.2011 23:54 # 0
SmackMyBitchUp 25.07.2011 00:01 # 0
zooz13 25.07.2011 01:25 # 0
SmackMyBitchUp 25.07.2011 01:41 # 0
Объявление и инициализация матрицы присутствует.
Метод ввода данных отсутствует.
zooz13 25.07.2011 01:46 # 0
SmackMyBitchUp 25.07.2011 02:02 # 0
SmackMyBitchUp 25.07.2011 02:13 # +1
if (dim == 1) return matrix[0][0];
if (dim == 2) return matrix[0][0]*matrix[1][1] - matrix[0][1] * matrix[1][0];
...//блок вычислений
return result;
Хотя я с поиском через разложением по столбцу не знаком (или вру, но забыл) и первые два условия не имеют необходимости и можно занести все в один блок вычислений. Это вопрос так. Ради интереса.
И еще - где здесь рекурсия? Мб подразумевается что она развернута в цикл, но все таки...
kaspvar 25.07.2011 07:16 # 0
2.Мой преподователь это книга + интернет.
3.Ето не весь класс: все остальные методы
в том числе и иинициализацию я не выкладывал.
4.roman-kashityn - спасибо! Переделаю.
Один вопрос: почему все-таки говно?
Долго считать будут при больших размерностях?
5.SmackMyBitchUp - рекурсия запускается в
49-й строке. Первые два случая: для 2*2 и 1*1 вынесены
отдельно так как алгоритм для размерности >2
их посчитать не сможет.
SmackMyBitchUp 25.07.2011 07:39 # 0
а какова точка останова подскажите, пожалуйста.
roman-kashitsyn 25.07.2011 08:32 # 0
roman-kashitsyn 25.07.2011 08:30 # 0
И, кстати, обратите внимание на интерфейсы стандартных классов типа BigInteger, они подскажут, как лучше организовать интерфейсы для матриц в плане сигнатур и названий методов.
kaspvar 25.07.2011 08:57 # 0
Чтобы собственно вычислить определитель разложением по определению нужно: выбрать строку/столбец,
1.взять оттуда каждый элемент,
2.умножить его на алгебраическое дополнение(знак*минор элемента),
3.и сложить все слагаемые.
Тут мы создаем минор элемента:
for (int j = 1; j < this.dim; j++) {
System.arraycopy(this.matrix[j], 0, minor.matrix[j - 1], 0, i);
System.arraycopy(this.matrix[j], i + 1, minor.matrix[j - 1], i, this.dim - (i + 1));
}
А здесь собственно умножаем элемент на его алгебраическое дополнение и записываем все в result, который собственно и является определителем матрицы.
result += Math.pow(-1, i) * this.matrix[0][i] * minor.findDet();
Здесь рекурсия ->minor.findDet().
Зачем вызывать findDet() в цикле? Думаю, это лучший вариант сложить все слагаемые строки/столбца в result, как можно быстрей.
QNOZFti 25.08.2021 09:48 # 0