矩陣一維存儲
① 無向圖的鄰接矩陣可用一維數組存儲對嗎
習慣上無向圖的鄰接矩陣一般用二維數組存儲,這樣使用方便。當然,任意二維數組都是可以用一維數組存儲的,只是用起來不方便。
② 存儲矩陣示意圖怎麼看
在圖形處理中,矩陣操作時最基本的操作,但是不同的系統中對矩陣的存儲是不同,比如OpenGL和Cg中就是不一樣的:
比如一個4x4矩陣[m11,m12,m13,m14
m21,m22,m23,m24
m31,m32,m33,m34
m41,m42,m43,m44],
在實現中通常將其存儲為一個一維的線性數組如float matrix【16】或者float* matrix。
在opengl中這個matrix中數據的順序是先遍歷列的,線性存儲為{m11,m21,m31,m41,m12,m22,m32......},這被稱為矩陣的列序(column-major)存儲,我們使用GlGetfloatv(GL_MODELVIEW_MATRIX,...)等得到的存儲矩陣的數組都是按照這樣的順序存儲矩陣的。
但是在cg中這個matrix的存儲順序確實先遍歷行的,也就是存儲為{m11,m12,m13,m14,m21,m22,m23,m24,m31,......},稱為行序(row-major)存儲,可能多數人認為這種存儲順序更「自然」,(其實我也這么覺得),這種存儲方式也被稱為是c-style的,好像是大多數系統里是按照行序存儲矩陣的。
不同的系統對矩陣的存儲方式不一樣,如果在程序中綜合使用了不同的框架,就要注意進行統一了,比如你在opengl 中使用了CG腳本的時候,例如一個cg程序void programm(uniform float4x4 modelviewMatrix,... ...)要求你從程序中傳入一個modelview矩陣,我們在程序中使用opengl的GlGetfloatv()函數得到了float* glmatrix 為這個modelview矩陣,但是這個glmatrix確不能直接賦給modelviewMatrix供cg使用,因為cg在解析這個glmatrix 會把它解析為行序的,我們可以在讓modelviewMatrix得到glmatrix 後,調用transfor()將modelviewMatrix做一個轉置,modelviewMatrix就變成cg所能正確解析的行序的了。
行序和列序的轉換其實就是一個矩陣的轉置關系,雖然這個變換很簡單,但是在使用不同的框架時,要記得先注意一下這個系統式採用哪種方式存儲矩陣的,才不會犯錯。
③ 簡述一下如何將一個上三角矩陣以列為主序壓縮存儲在一個一維數組
給一維數組分配矩陣數據總數+2的長度。
數組第一個和第二個存儲矩陣的行數和列數
然後你將矩陣每列順序的存儲到該數組中
應該可以
列數判斷何時數組結束
行數判斷每列的界限
④ 設對稱矩陣A壓縮存儲在一維數組B中
首先由 a52能夠得到的信息有:
針對特殊的矩陣壓縮的方式是存儲下三角,而且下三角計算一維數組的下標是:k=i(i+1)/2+j
由a11 存儲在B[0]可以知道 從1開始存儲,計算時需要減1
a36位於上三角中,對應的下三角的點是a63,在根據公式就能算出下標,注意一定要找到下三角的點