矩陣之對稱矩陣、稀疏矩陣逆置與加法
一、對稱矩陣及壓縮儲存
由於對稱矩陣對角線上下相同,因此我們可以採取壓縮儲存。
我們先了解一下壓縮儲存,對稱矩陣儲存時只需要儲存上三角或下三角的資料,所以最多儲存n*(n+1)/2個資料。
我們就知道了我們需要空間的大小。
**如下:
測試結果如下:#includeusing namespace std;
#include//對稱矩陣
templateclass symmetricmatrix
} }t& acess(int row, int col)
void print()
cout << endl;
} cout << endl;
}private:
vector_arr;
size_t _n;
};int main()
, ,
, ,
};symmetricmatrixs(a);
cout << s.acess(2, 3) << endl;
cout << s.acess(3, 2) << endl;
s.acess(3, 2);
s.print();
system("pause");
return 0;
}
二、稀疏矩陣
1、稀疏矩陣的壓縮儲存和還原
稀疏矩陣:矩陣中有效值的個數遠小於無效值的個數,且這些資料的分布沒有規律。
所以可以採用只儲存非零元素(有效值)的方法來進行壓縮儲存。在進行壓縮儲存的時侯還要儲存非零元素在矩陣中的位置。所以我們要使用
三元組(trituple)儲存每乙個有效資料,三元組按原矩陣中的位置,以行優先順序先後順序依次存放。
三元組如下:
我們需要乙個容器儲存每個節點的內容,**如下:templatestruct trituple
};
為了測試方便我加了乙個display()函式,是為了檢測壓縮儲存是否正確,列印函式和輸出運算子過載都是輸出稀疏矩陣。templateclass sparsematrix
sparsematrix(t arr[m][n], t invalid) //儲存稀疏矩陣
:_row(m)
, _col(n)
, _invalid(invalid)
}} }
//列印壓縮矩陣
void display() }
//列印
void print()
else
}else
cout << _invalid << " ";
}cout << endl;
} cout << endl;
} //過載輸出運算子
friend ostream& operator<
else
}else
cout << matrix._invalid << " ";
}cout << endl;
} return cout;
}private:
vector> _v; //儲存有效節點
size_t _row;
size_t _col;
t _invalid; //無效值
};
測試:
結果以下,有效元素以及整個稀疏矩陣。int main(), ,
, ,};
sparsematrixsm(array, 0);
sm.display();
sm.print();
cout << sm << endl;
system("pause");
return 0;
}
三、矩陣的逆置
以上面稀疏矩陣為例,逆置就是將array[i][j]和array[j][i]的值交換。若我們直接將有效節點中的行列交換,輸出的話,能得到我們想要的結果嗎?
函式如下:
執行結果://矩陣逆置
void reversematrix()
swap(_row, _col);
}
並沒有成功,為什麼呢?
因為首次儲存時是按照行優先的儲存順序,若交換完依然按照行優先順序進行輸出,則不能全部輸出。
我們可以將交換後的有效元素按照行的大小排序,再輸出,如下(氣泡排序):
執行結果://矩陣逆置
void reversematrix()
swap(_row, _col);
for (size_t i = 0; i < _v.size(); i++)}}
四、矩陣的加法
兩個矩陣相加,即行列相對應的數相加。因此兩個矩陣必須行和列分別相等。
因為我們只儲存了有效元素,我們可以通過算出各個元素在原矩陣的偏移量,遍歷兩個矩陣,偏移量相等時相加;第乙個矩陣元素偏移量小時,證明第二個矩陣沒有對應元素。反之亦然。
**如下:
測試結果如下:sparsematrix& operator+(sparsematrix& matrix)
sparsematrix* ret = new sparsematrix(_row, _col, _invalid);
size_t leftindex = 0, rightindex = 0;
size_t addl = 0, addr = 0;
while (leftindex < _v.size() && rightindex < matrix._v.size())
else if (addl > addr)
else
}while (leftindex < _v.size()) //第二個已經無有效元素
while (rightindex < _v.size()) //第乙個已經無有效元素
return *ret;
}
矩陣 對稱矩陣及稀疏矩陣的壓縮儲存
1.稀疏矩陣 稀疏矩陣及其壓縮儲存 pragma once include include using namespace std templatestruct triple template class sparsematrix sparsematrix t arr,size t row,size...
稀疏矩陣轉置矩陣
num 矩陣a中某列的非零元素的個數 cpot 初值表示矩陣a中某列第乙個非零元素在b中的位置,並有如下遞推 cpot 1 0 cpot col cpot col 1 num col 1 2 col nu end right.const int maxterm 100 struct sparsema...
轉置矩陣,逆矩陣和倒轉置矩陣
單位矩陣 轉置矩陣 transpose matrix 性代數中,矩陣 a的轉置是另乙個矩陣a t 也寫做a tr,t a或a 由下列等價動作建立 形式上說,m n矩陣a的轉置是n m矩陣 對於矩陣a,b和標量c轉置有下列性質 轉置是從 m n矩陣的 向量空間到所有 n m矩陣的向量空間的 線性對映。...