對稱矩陣 稀疏矩陣及矩陣的逆置與加法

2021-08-11 05:52:17 字數 3458 閱讀 9750

矩陣之對稱矩陣、稀疏矩陣逆置與加法

一、對稱矩陣及壓縮儲存

由於對稱矩陣對角線上下相同,因此我們可以採取壓縮儲存。

我們先了解一下壓縮儲存,對稱矩陣儲存時只需要儲存上三角或下三角的資料,所以最多儲存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

};

我們需要乙個容器儲存每個節點的內容,**如下:

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; //無效值

};

為了測試方便我加了乙個display()函式,是為了檢測壓縮儲存是否正確,列印函式和輸出運算子過載都是輸出稀疏矩陣。

測試:

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矩陣的向量空間的 線性對映。...