用遞歸寫了一個求n階行列式的算法。用4階行列式舉例:
瑪納斯網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),瑪納斯網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為瑪納斯超過千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的瑪納斯做網(wǎng)站的公司定做!
1?2?3?4
5?6?7?8
4?3?2?1
8?7?6?5
為了方便計算,我沒有用二維數(shù)組。
把矩陣用一維數(shù)組A存起來,并指出維數(shù)n。
第i行第j列的元素的下標(biāo)是i*n+j
#include?stdio.h
#include?stdlib.h
//求余子式M的函數(shù),參數(shù)是矩陣,維數(shù),i行,j列
//比如M(A,?4,?0,?0)表示去掉第1列,第1列的元素后剩下的數(shù)組成一個數(shù)組
//6?7?8
//3?2?1
//7?6?5
//然后用A[i*n+j]和余子式的值相乘
int*?M(int?*A,?int?n,?int?i,?int?j)
{
int?*B=?(int*)malloc((n?-?1)*sizeof(int));
int?k?=?0;
for?(int?k1?=?0;?k1??n;?++k1)
{
if?(k1?!=?i)
for?(int?k2?=?0;?k2??n;?++k2)
if?(k2?!=?j)
B[k++]?=?A[k1*n?+?k2];
}
return?B;
}
int?det(int?A[],?int?n)
{
int?sum?=?0,?N?=?n*n;
if?(n?==?1)
sum?=?A[0];
else
{
for?(int?i?=?0;?i??n;?++i)
{
int?*tmp?=?M(A,?n,?i,?0);
int?Aij?=?A[i*n]*det(tmp,?n?-?1);
if?(i%2?!=?0)
Aij?=?-Aij;
sum?=?sum?+?Aij;
}
}
return?sum;
}
int?main()
{
int?A[]={2,1,3,-1,1,-5,1,1,2,3,2,2,0,-1,4,2};
printf("%d\n",?det(A,?4));
return?0;
}
度量空間變換的比例,拉伸或縮放,如果det=2,則將空間面積變?yōu)樵瓉?倍,det=0,說明將空間壓縮到一條直線或者是一個點上。如果det為負(fù)值,說明空間定向發(fā)生了翻轉(zhuǎn)(類似反面)
矩陣乘法與線性變換復(fù)合:兩個矩陣相乘的幾何意義:兩個線性變換相繼作用,也就是復(fù)合的線性變換,先左乘變換再左乘變換。類似于復(fù)合函數(shù),從右向左讀。矩陣乘法的不可交換性理解:變換的次序,更換不同的變換次序,將得到不同的空間變換結(jié)果。
之前的理解可推廣到高維空間,如三維空間,三維空間的矩陣相乘在計算機(jī)圖形學(xué)和機(jī)器人學(xué)應(yīng)用廣泛。
det的意思:det是一個計算機(jī)函數(shù),在FreeMat、Matlab中,該函數(shù)用于求一個方陣(square matrix)的行列式(Determinant)。
det功能:det為矩陣的行列式值。det計算某一方陣(行列相等的二維數(shù)組)的對應(yīng)行列式值每一矩阼都有一個對應(yīng)的行列式。行列式是對矩陣表按一定規(guī)則進(jìn)行運(yùn)算之后所得到的一個數(shù)值。
行列式可以確定出對應(yīng)矩陣是否存在著逆,即確定矩陣的奇異性,可以用來解線性方程組等。當(dāng)行列式為0或近似于0時,其對應(yīng)逆矩陣不存在,或雖然存在,但計算機(jī)計算出來的結(jié)果不正確。
det函數(shù)的程序示例:
在FreeMat中的示例:
-- A = [0 0 0; 1 2 3; 4 5 6];-- det(A),ans =0。
-- B = [1 2; 3 4];-- det(B),ans =-2。