-
算法介紹
矩陣求逆在程序中很常見,主要應(yīng)用于求Billboard矩陣。按照定義的計算方法乘法運算,嚴(yán)重影響了性能。在需要大量Billboard矩陣運算時,矩陣求逆的優(yōu)化能極大提高性能。這里要介紹的矩陣求逆算法稱為全選主元高斯-約旦法。
高斯-約旦法(全選主元)求逆的步驟如下:
首先,對于 k 從 0 到 n - 1 作如下幾步:
從第 k 行、第 k 列開始的右下角子陣中選取絕對值最大的元素,并記住次元素所在的行號和列號,在通過行交換和列交換將它交換到主元素位置上。這一步稱為全選主元。
m(k, k) = 1 / m(k, k)
m(k, j) = m(k, j) * m(k, k),j = 0, 1, ..., n-1;j != k
m(i, j) = m(i, j) - m(i, k) * m(k, j),i, j = 0, 1, ..., n-1;i, j != k
m(i, k) = -m(i, k) * m(k, k),i = 0, 1, ..., n-1;i != k
最后,根據(jù)在全選主元過程中所記錄的行、列交換的信息進(jìn)行恢復(fù),恢復(fù)的原則如下:在全選主元過程中,先交換的行(列)后進(jìn)行恢復(fù);原來的行(列)交換用列(行)交換來恢復(fù)。
標(biāo)簽:
算法
矩陣求逆
程序
上傳時間:
2015-04-09
上傳用戶:wang5829
-
本程序是用c++實現(xiàn)的多功能文本編輯器,它除了可以實現(xiàn)一般文本的編輯功能,還增加了保存文檔a(save), 轉(zhuǎn)為大寫m(large),改為小寫k(small),復(fù)制段j(copy),中英文轉(zhuǎn)換t(language)等功能
標(biāo)簽:
程序
多功能
文本編輯器
上傳時間:
2013-12-23
上傳用戶:wuyuying
-
矩陣中的每一個元素稱為像元、像素或圖像元素。而g(i, j)代表(i, j)點的灰度值,即亮度值。
由于g (i, j)代表該點圖像的光強(qiáng)度(亮度),而光是能量的一種形式,故g (i, j)必須大于零,且為有限值,即: 0<=g (i, j)<2n。
用g (i, j)的數(shù)值來表示(i, j)位置點上灰度級值的大小,即只反映了黑白灰度的關(guān)系。
數(shù)字化采樣一般是按正方形點陣取樣的,
標(biāo)簽:
元素
矩陣
像素
圖像
上傳時間:
2013-12-22
上傳用戶:lunshaomo
-
經(jīng)典C語言程序設(shè)計100例1-10
如【程序1】
題目:有1、2、3、4個數(shù)字,能組成多少個互不相同且無重復(fù)數(shù)字的三位數(shù)?都是多少?
1.程序分析:可填在百位、十位、個位的數(shù)字都是1、2、3、4。組成所有的排列后再去
掉不滿足條件的排列。
2.程序源代碼:
main()
{
int i,j,k
printf("\n")
for(i=1 i<5 i++) /*以下為三重循環(huán)*/
for(j=1 j<5 j++)
for (k=1 k<5 k++)
{
if (i!=k&&i!=j&&j!=k) /*確保i、j、k三位互不相同*/
printf("%d,%d,%d\n",i,j,k)
}
}
標(biāo)簽:
100
10
C語言
程序設(shè)計
上傳時間:
2013-12-14
上傳用戶:hfmm633
-
給定n個整數(shù)a , a , ,an 1 2 組成的序列。序列中元素i a 的符號定義為:
ï î
ï í
ì
- <
=
>
=
1 0
0 0
1 0
sgn( )
i
i
i
i
a
a
a
a
符號平衡問題要求給定序列的最長符號平衡段的長度L,即:
þ ý ü
î í ì
= + - = å
=
£ £ £
max 1| sgn( ) 0
1
j
k i
i j n k
L j i a 。
例如,當(dāng)n=10,相應(yīng)序列為:1,1,-1,-2,0,1,3,-1,2,-1 時,L=9。
標(biāo)簽:
iuml
61516
icirc
序列
上傳時間:
2015-10-28
上傳用戶:xaijhqx
-
void Knight(int i , int j)
{
// printf("%d %dn",i,j)
if (board[i][j] != 0 || i < 0 || i >= Size || j < 0 || j >= Size )
{
return
}
step++
board[i][j]=step
if (step == Size*Size)
{
showboard()
system("PAUSE")
return
}
//DFS
Knight(i-2,j-1) //left
Knight(i-2,j+1)
Knight(i+2,j-1) //right
Knight(i+2,j+1)
Knight(i-1,j-2) //up
Knight(i+1,j-2)
Knight(i+1,j+2) //down
Knight(i-1,j+2)
//
board[i][j]=0
step--
}
標(biāo)簽:
int
Knight
printf
board
上傳時間:
2014-01-17
上傳用戶:cxl274287265
-
遙控解碼通過電腦串口顯示
/* 晶振:11.0569MHz */
#include <REGX52.h>
#define uchar unsigned char
uchar data IRcode[4] //定義一個4字節(jié)的數(shù)組用來存儲代碼
uchar CodeTemp //編碼字節(jié)緩存變量
uchar i,j,k //延時用的循環(huán)變量
sbit IRsignal=P3^2 //HS0038接收頭OUT端直接連P3.2(INT0)
/**************************延時0.9ms子程序**********************/
void Delay0_9ms(void)
{uchar j,k
for(j=18 j>0 j--)
for(k=20 k>0 k--)
}
/***************************延時1ms子程序**********************/
void Delay1ms(void)
{uchar i,j
for(i=2 i>0 i--)
for(j=230 j>0 j--)
}
標(biāo)簽:
uchar
unsigned
11.0569
include
上傳時間:
2013-12-12
上傳用戶:Breathe0125
-
手機(jī)網(wǎng)絡(luò)紙牌游戲,用戶名:mr
密碼:mrsoft。牌的大小按下列順序排列:A、K、Q、J、10、9、8、7、6、5、4、3、2。
1.出牌
(1)每輪只允許出一張牌。
(2)第一局游戲由得到梅花2的一方首先出牌,并且必須出梅花2。
(3)必須先出與首家相同花色的牌,無相同花色時方可用其它花色代替。
(4)最大方得到該輪的所有分牌,并獲得本輪先出牌的資格。
2.分值計算
紅桃:紅桃為分牌。
標(biāo)簽:
手機(jī)網(wǎng)絡(luò)
上傳時間:
2014-01-19
上傳用戶:笨小孩
-
實驗源代碼
//Warshall.cpp #include<stdio.h> void warshall(int k,int n) { int i , j, t; int temp[20][20]; for(int a=0;a<k;a++) { printf("請輸入矩陣第%d 行元素:",a); for(int b=0;b<n;b++) { scanf ("%d",&temp[a][b]); } } for(i=0;i<k;i++){ for( j=0;j<k;j++){ if(temp[ j][i]==1) { for(t=0;t<n;t++) { temp[ j][t]=temp[i][t]||temp[ j][t]; } } } } printf("可傳遞閉包關(guān)系矩陣是:\n"); for(i=0;i<k;i++) { for( j=0;j<n;j++) { printf("%d", temp[i][ j]); } printf("\n"); } } void main() { printf("利用 Warshall 算法求二元關(guān)系的可傳遞閉包\n"); void warshall(int,int); int k , n; printf("請輸入矩陣的行數(shù) i: "); scanf("%d",&k);
四川大學(xué)實驗報告 printf("請輸入矩陣的列數(shù) j: "); scanf("%d",&n); warshall(k,n); }
標(biāo)簽:
warshall
離散
實驗
上傳時間:
2016-06-27
上傳用戶:梁雪文以
-
#include "iostream" using namespace std;
class Matrix
{
private:
double** A; //矩陣A
double *b; //向量b
public:
int size;
Matrix(int );
~Matrix();
friend double* Dooli(Matrix& );
void Input();
void Disp();
};
Matrix::Matrix(int x) {
size=x;
//為向量b分配空間并初始化為0
b=new double [x];
for(int j=0;j<x;j++)
b[j]=0;
//為向量A分配空間并初始化為0
A=new double* [x];
for(int i=0;i<x;i++)
A[i]=new double [x];
for(int m=0;m<x;m++)
for(int n=0;n<x;n++)
A[m][n]=0;
}
Matrix::~Matrix() {
cout<<"正在析構(gòu)中~~~~"<<endl;
delete b;
for(int i=0;i<size;i++)
delete A[i];
delete A;
}
void Matrix::Disp()
{
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
cout<<A[i][j]<<" ";
cout<<endl;
}
}
void Matrix::Input()
{
cout<<"請輸入A:"<<endl;
for(int i=0;i<size;i++)
for(int j=0;j<size;j++){
cout<<"第"<<i+1<<"行"<<"第"<<j+1<<"列:"<<endl;
cin>>A[i][j];
}
cout<<"請輸入b:"<<endl;
for(int j=0;j<size;j++){
cout<<"第"<<j+1<<"個:"<<endl;
cin>>b[j];
}
}
double* Dooli(Matrix& A) {
double *Xn=new double [A.size];
Matrix L(A.size),U(A.size);
//分別求得U,L的第一行與第一列
for(int i=0;i<A.size;i++)
U.A[0][i]=A.A[0][i];
for(int j=1;j<A.size;j++)
L.A[j][0]=A.A[j][0]/U.A[0][0];
//分別求得U,L的第r行,第r列
double temp1=0,temp2=0;
for(int r=1;r<A.size;r++){
//U
for(int i=r;i<A.size;i++){
for(int k=0;k<r-1;k++)
temp1=temp1+L.A[r][k]*U.A[k][i];
U.A[r][i]=A.A[r][i]-temp1;
}
//L
for(int i=r+1;i<A.size;i++){
for(int k=0;k<r-1;k++)
temp2=temp2+L.A[i][k]*U.A[k][r];
L.A[i][r]=(A.A[i][r]-temp2)/U.A[r][r];
}
}
cout<<"計算U得:"<<endl;
U.Disp();
cout<<"計算L的:"<<endl;
L.Disp();
double *Y=new double [A.size];
Y[0]=A.b[0];
for(int i=1;i<A.size;i++ ){
double temp3=0;
for(int k=0;k<i-1;k++)
temp3=temp3+L.A[i][k]*Y[k];
Y[i]=A.b[i]-temp3;
}
Xn[A.size-1]=Y[A.size-1]/U.A[A.size-1][A.size-1];
for(int i=A.size-1;i>=0;i--){
double temp4=0;
for(int k=i+1;k<A.size;k++)
temp4=temp4+U.A[i][k]*Xn[k];
Xn[i]=(Y[i]-temp4)/U.A[i][i];
}
return Xn;
}
int main()
{
Matrix B(4);
B.Input();
double *X;
X=Dooli(B);
cout<<"~~~~解得:"<<endl;
for(int i=0;i<B.size;i++)
cout<<"X["<<i<<"]:"<<X[i]<<" ";
cout<<endl<<"呵呵呵呵呵";
return 0;
}
標(biāo)簽:
道理特分解法
上傳時間:
2018-05-20
上傳用戶:Aa123456789