Есть класс матрицы и метод, который возвращает определитель матрицы - Determinant. По неведомым причинам выходит за пределы двумерного списка. Сидим с друзьями, не можем понять почему так? Сам код:
public class Matrix
{
public List<List<int>> columns = new List<List<int>> { };
// List<int> row = new List<int> { };
public void GenerateMatrix(int N) {
Random random = new Random();
List<int> row = new List<int> { };
for (int i = 0; i < N; i++)
{
row = new List<int> { };
for (int j = 0; j < N; j++)
{
row.Add(random.Next(0, 10));
}
columns.Add(row);
}
}
public List<List<int>> MatrixReturn() {
return this.columns;
}
public double Determinant(Matrix matrix, int n)
{
Matrix mtr = new Matrix();
mtr.GenerateMatrix(n-1);
List<int> row = new List<int> { };
mtr.columns = new List<List<int>> { };
double det=0;
if (n != 2)
{
for (int i = 0; i < n; i++)//large matrix
{
mtr.columns = new List<List<int>> { };
for (int i1 = 0; i1 < n; i1++)//tiny matrix
{
row = new List<int> { };
for (int j = 0; j < n; j++)
{
if (i1 != 0 && j != i)
row.Add(matrix.columns[i1][j]);
}
mtr.columns.Add(row);
}
det += matrix.columns[0][i]*Math.Pow(-1, 1 + i) + Determinant(mtr, n - 1);
}
return det;
}
else
{
return det+ = matrix.columns[0][0] * matrix.columns[1][1] - matrix.columns[0][1] * matrix.columns[1][0];
}
}
}
Вот это безусловное добавление
mtr.columns.Add(row);
в цикле
for (int i1 = 0; i1 < n; i1++)//tiny matrix
явно неправильное - в новую матрицу (минор) при i1
равном нулю попадает пустой row
.
Потому и ошибка при последующем вызове Determinant
- вылезание за границу пустого списка.
Привет друзьям.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
На данный вопрос уже ответили:
Я не понимаю как реализовать клиент-серверную архитектуру на C# и MySql ! Поможет ли это приложению повысить безопасность?