就是取i 和 j中的較大者進行個數計算。
壓縮後的一維陣列大小為 n * ( n + 1 ) / 2;
在n * n的矩陣中,表示兩個對稱點是:( i 表示行,j 表示列)
num[ i * n + j ] 與 num[ j * n + i ];
如果這個對稱矩陣已經被表示為一維陣列儲存num[ n * n],那麼我們如何在一維陣列中進行轉置的運算呢?
當然在一維陣列中,我們也可以利用兩層迴圈直接交換按照對應位置的條件。
**實現:
#include
using namespace std;
constexpr auto maxsize =
100;
intmain()
} cout <<
"轉置後排列:"
<< endl;
for(
int i =
0; i < n * n; i++
) cout << map[i]
<<
" ";
system
("pause");
return0;
}
在矩陣中,若數值為0的元素數目遠遠多於非0元素的數目,並且非0元素分布沒有規律時,則稱該矩陣為稀疏矩陣;與之相反,若非0元素數目佔大多數時,則稱該矩陣為稠密矩陣。定義非零元素的總數比上矩陣所有元素的總數為矩陣的稠密度。
經常定義t / (m * n )表示稀疏因子,如果 t <= 0.05時,稱為稀疏矩陣,但也不絕對,對於具體問題具體分析
因為稀疏矩陣過於占用空間,我們可以用一維陣列來進行儲存
但是需要的條件是不為零的值在矩陣中的座標( i , j )以及值,
那麼在一維陣列中我們可以用 i * 10 + j 來表示在一維陣列中的下標,即num[i * 10 + j ] =value;
這樣可以有利於的避免重複。
或者結構體實現
#define maxnum 大於矩陣中非零元素個數的常數
typedef
struct
triple;
typedef
struct
matrix;
如果按照結構體三元組表進行儲存,如何進行轉置的處理呢?
將矩陣的行列值相互交換;
將每個三元組中的 i 和 j 互換;
重排三元組的次序即可實現三元組的轉置
**實現
#include
#include
using namespace std;
#define maxnum 10
//大於矩陣中非零元素個數的常數
typedef
int elemtype;
//值;
typedef
struct
triple;
typedef
struct
matrix;
intmain()
cout <<
"轉置前"
<< endl;
for(i =
1; i <= node.tu; i++
) cout <<
"i = "
<< node.data[i]
.i <<
" j = "
<< node.data[i]
.j <<
" value = "
<< node.data[i]
.e << endl;
cout <<
" "
<< endl;
int q =1;
for(
int col =
1; col <= node.nu;
++col)
//轉置}}
temp.mu = node.mu;
temp.nu = node.nu;
temp.tu = node.tu;
cout <<
"轉置後"
<< endl;
for(i =
1; i <= temp.tu; i++
) cout <<
"i = "
<< temp.data[i]
.i <<
" j = "
<< temp.data[i]
.j <<
" value = "
<< temp.data[i]
.e << endl;
system
("pause");
return0;
}
執行結果
除此之外,由於較於上面這演算法的實現,我們還有一種更加快速的轉置的實現方法
該演算法的思想是:如果能夠預先確定原始矩陣中的每一列的第乙個非零元素在轉置之後的矩陣中所在的位置,那麼對在原始矩陣中的三元組做轉置的時候,可以直接放在轉置矩陣的三元組表中。為了確定這些表中的元素的位置,我們應該先計算求得每一列中的非元素的個數,進而求得每一列中的第乙個非零元素在轉置後的矩陣的三元組中的位置。
我們需要設定兩個陣列:
cpot[maxsize]記錄每一列中的第乙個非零元素在轉置後的三元組中的對應的位置,num[col]記錄第col列中的非零元素的個數。
cpot[ 1 ] = 1;//第一列中的第乙個非零元素肯定放置在轉置後的三元組的第一行的位置。
cpot[ col ] = cpot[ col - 1] + num[ col - 1];// 2 <= col <=m.nu;遞迴關係式
int
fasttransposesmatirx
(tsmatrix m, tsmatrix &t)
}return1;
}
此時的時間複雜度為o(nu + tu);
矩陣經典操作(1)
關於矩陣的經典操作1,那就是座標的變換 通過二維空間或者三維空間,給定n個點,m 個操作,構造o m n 的演算法輸出m個操作後各點的位置,操作有平移 縮放 翻轉和旋轉 參考 十個利用矩陣乘法解決的經典題目 在三維空間中就是擴張一下就可以了,只是在三維空間的旋轉,如果給定的是角度,那麼就要注意公式如...
MatLab學習1 矩陣操作
1 簡單矩陣構造 a 1,2,3 構造乙個1x3的矩陣,各元素為1,2,3 或者a 1 2 3 使用空格 b 1,2,3 7,4,9 兩行三列矩陣b 2 特殊矩陣構造 1 ones函式 a ones n 構造nxn的全1矩陣 b ones m,n 產生mxn的全1矩陣 2 zeros 類似的有 a ...
MATLAB矩陣基本操作1
matlab 矩陣操作 結構矩陣 和單元矩陣 結構矩陣 格式為 結構矩陣元素.成員名 表示式a 1 x1 10 a 1 x2 liu a 1 x3 10 21 34 78 a 2 x1 11 a 2 x2 xia a 2 x3 11 121 34 78 a 3 x1 12 a 3 x2 cai a ...