第一次寫自己的部落格,專案有乙個簡單的專案需求,需要用到大量的矩陣運算,因此寫了乙個簡單的矩陣求解類。
這裡貼上第一塊,如何求解行列式的值。
行列式的求解直接利用了定義,乙個矩陣的行列式可以表示為 |a| =∑( -1)^(j) * a0j * |m|, 其中, j 表示第0行第j列,a0j表示第0行第j個元素,m表示a0j的代數余子式,基於該公式,編寫矩陣行列式求解的**。
可以看到,代數余子式也是乙個矩陣,因此,很容易想到用遞迴的方法進行求解,這裡貼上遞迴求解**
/**計算a行列式的結果,採用遞迴方式
* @param a 行列式
* @param length a行列式的行數
* @return
*/public double get_determinant(double a,int length)
double result = 0;
//子行列式不是2*2矩陣
//b矩陣為a[0][j]的子矩陣
double b = new double[length - 1][length - 1];
for(int i = 0; i < length; i++)
b = get_submatrix(a, 0, i, length);
result = result + math.pow(-1,i) * a[0][i] * get_determinant(b,length - 1);
} return result;
}
在該函式中,需要獲取不同a0j對應的代數余子式/**獲取當前矩陣某個元素的子矩陣
* @param a 當前矩陣
* @param m 第m行
* @param n 第n列
* @param length 矩陣的行
* @return 子矩陣
*/public double get_submatrix(double a, int m, int n, int length)
i_b++;
j_b = 0;
} return b;
}
最後,就是呼叫get_determinant函式,進行計算,所有的計算均以第一行為計算行,因此,我們要分別求第一行元素乘其代數余子式對應的值,**如下:
/**計算行列式
* @param a 要求解的矩陣
* @return 行列式的結果
*/public double get_result(double a)
int length = a.length;
//如果是二維的話可以直接返回結果
if(length == 2)
double result = 0; //行列式的值
double b = new double[length][length];
for(int i = 0; i < length; i++)
result = result + math.pow(-1,i) * a[0][i] * get_determinant(b,length - 1);
} return result;
}
最後,直接呼叫get_result,就可以獲得當前矩陣的行列式的值了,當然,為了保證計算過程無錯,在進行計算前,先判斷該矩陣是否為n*n矩陣,如果不是,則直接返回null
關於行列式的乙個猜想
對於乙個方陣 begin a left begin a a cdots a a a cdots a vdots vdots ddots vdots a a cdots a end right end 用 a i 來表示方陣 a 中第 i 個列向量。取n維空間中的一組單位正交基 boldsymbol,...
求矩陣行列式以及其他一些東西
嘛。因為一道水題做不出來而被大佬鄙視的我決定讓計算機來做 我不信大佬還能夠有計算機快2333 稍微寫了點 實現了求行列式的功能。如果有時間的話說不定會把求逆也給碼了 咕咕咕 include includeusing namespace std void input double a,int n,in...
Leetcode 求缺失的第乙個正數
求缺失的第乙個正數 給定乙個未排序的整數陣列,找出其中沒有出現的最小的正整數。示例 1 輸入 1,2,0 輸出 3 示例 2 輸入 3,4,1,1 輸出 2 示例 3 輸入 7,8,9,11,12 輸出 1 說明 你的演算法的時間複雜度應為o n 並且只能使用常數級別的空間。思路 盡可能地把陣列中不...