目錄
轉置矩陣
-
定義
-
性質
/// <summary>
/// 轉置矩陣
/// </summary>
/// <param name="arr"></param>
/// <returns></returns>
public float[,] TransposeMatrix(float[,] arr)
{
for (int i = 0; i < arr.GetLength(0); i++)
{
for (int j = i + 1; j < arr.GetLength(1); j++)
{
float temp = arr[i, j];
arr[i, j] = arr[j, i];
arr[j, i] = temp;
}
}
return arr;
}
行列式
-
餘子式
-
代數餘子式
代數餘子式等於對應的餘子式的有符號的行列式
-
n階矩陣求行列式公式
-
意義
在2D中行列式代表着以基向量爲兩邊的平行四邊形的有符號面積.在3D環境中則代表着以基向量爲三邊的平行六面體有符號體積
/// <summary>
/// 求矩陣的行列式
/// </summary>
public static float GetDeterminant(float[,] arr)
{
if (arr.GetLength(0) <= 2) return GetSubArrDeterminant(arr, 0, 0);
float num = 0;
for (int i = 0; i < arr.GetLength(1); i++)
{
num += GetSubArrDeterminant(arr, 0, i) * (float)Math.Pow(-1, i);
}
return num;
}
/// <summary>
/// 得到餘子式的行列式
/// </summary>
public static float GetSubArrDeterminant(float[,] arr, int x, int y)
{
if (arr.GetLength(0) == 2)
{
return arr[0, 0] * arr[1, 1] - arr[0, 1] * arr[1, 0];
}
return arr[x, y] * GetDeterminant(GetSubArr(arr, x, y));
}
/// <summary>
/// 得到餘子式
/// </summary>
public static float[,] GetSubArr(float[,] arr, int x, int y)
{
if (arr.GetLength(0) <= 1) return arr;
float[,] temp = new float[arr.GetLength(0) - 1, arr.GetLength(1) - 1];
for (int i = 0; i < arr.GetLength(0); i++)
{
if (i == x) continue;
for (int j = 0; j < arr.GetLength(1); j++)
{
if (j == y) continue;
temp[i < x ? i : i - 1, j < y ? j : j - 1] = arr[i, j];
}
}
return temp;
}
伴隨矩陣
- 矩陣M的代數餘子式矩陣的轉置矩陣(挺繞口)
/// <summary>
/// 求矩陣的伴隨矩陣
/// 求每個元素的代數餘子式,組成一個矩陣
/// </summary>
public static float[,] GetAdjointMatrix(float[,] arr)
{
if (arr.GetLength(0) <= 2) return arr;
float[,] result = new float[arr.GetLength(0), arr.GetLength(1)];
for (int i = 0; i < arr.GetLength(0); i++)
{
for (int j = 0; j < arr.GetLength(1); j++)
{
float[,] temp = GetSubArr(arr, i, j);
result[i, j] = (float)Math.Pow(-1, i + j) * GetDeterminant(temp);
}
}
return result;
}
逆矩陣
- 定義
假設一個方陣M,方陣M的逆,記作M^-1,方陣的逆也是一個矩陣.當M和M^-1相乘的時候,結果是單位矩陣I
- 求解方法
adj M叫做矩陣M的伴隨矩陣,定義爲矩陣M的代數餘子式矩陣的轉置矩陣(挺繞口)
public float[,] Inverse(float[,] arr)
{
float det = GetDeterminant(arr);
if (det.Equals(0))
{
Console.WriteLine("行列式爲0,沒有逆矩陣");
}
else
{
float[,] adjM = GetAdjointMatrix(arr);
for (int i = 0; i < arr.GetLength(0); i++)
{
for (int j = i + 1; j < arr.GetLength(1); j++)
{
arr[j, i] /= det;
}
}
}
return arr;
}
正交矩陣
兩個矩陣相加減
即它們相同位置的元素相加減
兩個矩陣相乘
乘法只有在第一個矩陣的列數和第二個矩陣的行數相同時纔有意義
如果想要理解矩陣變換的幾何意義,推薦看一下這個視頻