對於乙個三角矩陣,如何得到排序向量 p
pp ?給出演算法並用程式實現它;
請實現三角系統的向前帶入演算法,給出程式並通過算例驗證;
請給出三角系統的向後帶入演算法,給出程式並通過算例驗證;
由於給出矩陣預設為三角矩陣,因此通過排序後只有上三角或下三角兩種可能。因此我們先以下三角矩陣為例進行分析,然後再考慮如何判斷三角矩陣的型別;
對於乙個可化為下三角矩陣的三角矩陣an×
na_
an×n
,其第 i
ii 列向量至少有 (n−
i+1)
(n-i+1)
(n−i+1
) 個 0
00 元。而當我們從後向前遍歷時,第 i
ii 列出現的非零元所在行向量即為排序後第 i
ii 行(需排除從 i+1
i+1i+
1 到 n
nn 已找出的行向量),上三角矩陣反之;
通過2所述方法我們可以找到排序向量,但倘若採用暴力遍歷的方式,其複雜度為 o(n
2)
o(n^2)
o(n2
) 對於大矩陣來說是不太理想的,考慮採用佇列的方式優化,即用 (1→
n)
(1\to n)
(1→n
) 到初始化佇列,然後按佇列裡資料 i
ii 從矩陣最後一列開始遍歷,第 i
ii 行數值非零即彈出否則再入隊尾;
由於不清楚三角陣的型別,我們可以先假設其為下三角陣,如果該矩陣本為上三角陣或存在主元為0,則迭代過程中就會出現:在排除從 i+1
i+1i+
1 到 n
nn 已找出的行向量後剩餘行向量在第 i
ii 列的值均為0的情況,即找不出非零元。那麼可以假設其為上三角陣再計算一遍。若仍存在找不到非零元情況,則可以判斷存在0主元排序向量不唯一且向前或向後帶入法不可解;
最後考慮到在c++中輸入矩陣視覺化較差且出錯不易修改,考慮在txt檔案中輸入矩陣,然後通過演算法讀入並儲存。
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
bool
under_tag
(vectorint>>
& matrix, vector<
int>
& p,
int n)
int l = n -1;
//從最後一列開始遍歷
int rept =0;
//迭代步
while
(!init.
empty()
&& rept < n)
else}if
(rept < n)
else
}bool
up_tag
(vectorint>>
& matrix, vector<
int>
& p,
int n)
int l =0;
//從第一列開始遍歷
int rept =0;
//迭代步
while
(!init.
empty()
&& rept < n)
else}if
(rept < n)
else
}void
function1
(vector<
double
>
& ans, vectorint>>
& matrix, vector<
int>
& p,
int n)
else
ans[i]=(
(double
)matrix[p[i]
][n]
- temp)
/ matrix[p[i]
][i];}
}}void
function2
(vector<
double
>
& ans, vectorint>>
& matrix, vector<
int>
& p,
int n)
else
ans[i]=(
(double
)matrix[p[i]
][n]
- temp)
/ matrix[p[i]
][i];}
}}intmain()
string line;
vector arr;
while
(getline
(read_file, line)
) n = arr.
size()
;//獲得矩陣的行數,即維度
vectorint>>
matrix
(n, vector<
int>
(n +1,
0));
//用二維vector儲存增廣矩陣
for(
int i =
0; i < n; i++
)else}}
cout <<
"輸入矩陣為:"
<< endl;
//將讀入矩陣輸出
for(
int i =
0; i < n; i++
) cout << endl;
} cout << endl;
vector<
int> p;
//定義排序向量
while
(!p.
empty()
) p.
pop_back()
;//初始化
vector<
double
> ans;
//儲存解並初始化
for(
int i =
0; i < n; i++
) ans.
push_back(0
);if(
under_tag
(matrix, p, n)
==true
) cout << endl << endl;
cout <<
"採用向前帶入演算法"
<< endl << endl;
//採用向前帶入演算法
function1
(ans, matrix, p, n);}
elseif(
up_tag
(matrix, p, n)
==true
) cout << endl << endl;
cout <<
"採用向後帶入演算法"
<< endl << endl;
//採用向後帶入演算法
function2
(ans, matrix, p, n);}
else
cout <<
"方程的解x1到x"
<< n <<
"為:"
;//輸出解
for(
int i =
0; i < n; i++
) cout << endl;
return0;
}
最近好忙啊,沒時間再作修改了,就按照上機報告的樣子拷貝過來了。有什麼錯誤或考慮不周全的忘各位看官們指出。另外要是有人能教教我typora**塊匯出錯位如何解決就好了,哈哈哈,不過我這小部落格應該沒幾個人看吧~ 上三角矩陣下三角矩陣
要求給定矩陣,輸出其上三角矩陣或下三角矩陣 源 如下 include include include include const int m 5 void proc int array m m void main printf n proc a printf result array is n fo...
帶狀矩陣,對稱矩陣,三角矩陣
對稱矩陣 include 重要公式 p k k 1 2 p1 sizeof int p p1 p1 1 2 k sizeof int include int main printf 請輸入要詢問的數 n printf d n p for i 1 i m i else 在對角線以上可以通過對角線以下查...
判斷上三角矩陣
第5題 描述 輸入乙個正整數n 2 n 10 和n n矩陣a中的元素,如果a是上三角矩陣,輸出 yes 否則輸出 no 輸入 第一行為正整數n,表示矩陣大小。接著n行,每一行n個整數,整數以空格間隔。輸出 輸出 yes 或 no 輸入示例 33 4 5 1 2 3 1 3 4 輸出示例 no 提示 ...