Возведение квадратной матрицы в степень
Можете подсказать что не так? Функция должна возводить квадратную матрицу А(размерностью s, для удобства тестирования это 7 ) в степень length , вот как я пробовал сделать, но у меня выходит функция возносит А в квадрат, length раз
static void a_mult(int [,]A,ref int [,] B, int s, int length)
{
for (int k = 1; k < length; k++)
{
for (int i = 0; i < s; i++)
{
for (int j = 0; j < s; j++)
{
A[i, j] = B[i, j];
}
}
for (int i = 0; i < s; i++)
{
for (int j = 0; j < s; j++)
{
B[i, j] = (A[i, 0] * A[0, j]) + (A[i, 1] * A[1, j]) + (A[i, 2] * A[2, j]) + (A[i, 3] * A[3, j]) + (A[i, 4] * A[4, j]) + (A[i, 5] * A[5, j]) + (A[i, 6] * A[6, j]);
}
}
}
}
P.S. Я попробовал переделать функцию так, но считает все равно не верно:
static int[,] Proizvedenie(int[,] a, int[,]b , int f)
{
int[,] res = new int[f, f];
for (int i = 0; i < f; i++)
for (int j = 0; j < f; j++)
for (int k = 0; k < f; k++)
res[i, j] += a[i, k] * b[k, j];
return res;
}
Вот как выглядит вызов функции
for (int k=0; k<length;k++)
a_multed = Proizvedenie(global_mas, a_multed, size);
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
private static int[,] PowMatrix(int[,] m, int power)
{
if (m.GetLength(0) != m.GetLength(1))
throw new ArgumentException("Матрица не квадратная");
if (power < 1)
throw new ArgumentException("Степень должна быть натуральным числом");
int size = m.GetLength(0);
int[,] result = m;
for (int p = 1; p < power; p++)
{
int[,] temp = new int[size, size];
for (int i = 0; i < size; i++)
for (int j = 0; j < size; j++)
{
int sum = 0;
for (int k = 0; k < size; k++)
sum += result[i, k] * m[k, j];
temp[i, j] = sum;
}
result = temp;
}
return result;
}
static void Main(string[] args)
{
int[,] matrix = new int[,]
{
{ 1, 2 },
{ 3, 4 }
};
int[,] result = PowMatrix(matrix, 2);
PrintMatrix(result);
Console.ReadKey();
}
private static void PrintMatrix(int[,] m)
{
int padding = m.Cast<int>().Select(x => Math.Abs(x)).Max().ToString().Length + 2;
for (int i = 0; i < m.GetLength(0); i++)
Console.WriteLine(string.Concat(Enumerable.Range(0, m.GetLength(1)).Select(j => m[i, j].ToString().PadLeft(padding))));
}
7 10
15 22