簡體   English   中英

專為行/列操作設計的稀疏矩陣存儲格式?

[英]Sparse matrix storage format designed for row/col manipulation?

我正在使用需要訪問並以稀疏矩陣存儲數據的程序。 約40-60%的矩陣將為非零值,尺寸范圍從14K到22K元素平方。

這是我的問題-我將執行很多行和列操作。 主要是添加,刪除和交換。 我已經研究了大多數現有的稀疏矩陣格式(CRS,CCS,COO,塊格式等),其中大多數似乎不太接受此類操作。 開始添加和刪除整個行或列的那一刻,您不得不將所有元素都更新到可操作的行/列的任一側,這是我想嘗試避免的操作(如果發生的話,這是我自己想到的)這樣您就可以通過以下方式管理元素:將它們在矩陣中的坐標實際上存儲為指向公共行或列索引的一對指針,從而避免通過簡單地遞增或遞減該值來手動更新數千個元素。

那里有類似的東西嗎?

我將考慮使用間接層作為交換,插入和刪除行和列的有效機制。

這類似於在現代操作系統中如何管理虛擬內存。 這只是一個簡短的提示:物理RAM地址由CPU的內存管理單元映射到線性尋址空間中。 MMU在主機O / S的幫助下,將實際的物理RAM地址映射到每個進程的虛擬地址空間。 指針和其他對象在每個進程中使用的地址不是真實的RAM地址,而是虛擬的,並由硬件MMU單元轉換為實際的物理RAM地址。 這就是為什么當系統空間不足時,主機操作系統可以將空閑進程分頁到交換文件或分區中,然后在以后將其重新加載到物理RAM的某些完全不同的區域中的原因,甚至不需要知道發生了什么。

無論如何,回到主題上,這將是一個類似的方法。

考慮一個普通的,花園式的二維std::map 這是您的稀疏矩陣:

std::map<size_t, std::map<size_t, value_t>>

第一個地圖的維或鍵是行,它為您提供了第二張地圖,其維/鍵是列,最后包含了您的值。

這很簡單。 這里沒有驚天動地。 但是,正如您所了解的那樣:移動,交換和插入行和列變得非常麻煩。

好的,讓我們介紹您自己的個性化MMU:您的地圖管理單元。 它幾乎可以像硬件MMU一樣工作:

std::map<size_t, size_t> rows;
std::map<size_t, size_t> columns;

因此,在您的示例中,要查找虛擬行R ,列C

1) rows[R]為您提供“物理”行號。

2) columns[C]為您提供“物理”列號。

3)現在,您獲取“物理”行和列號,然后轉到二維std::map ,並在給定物理行和列的情況下查找您的值。

那么,我們怎么到達這里? 好了,現在移動整個行或列將涉及對地圖管理單元的簡單更新。 rowscolumns映射中刪除一個值,然后使用另一個鍵(新的“邏輯”行或列)將其放回去。 二維“物理”圖中的值保持不變。

而已。 移動,交換或插入行成為對mmu對象的簡單操作。

還有兩個其他細節需要注意:

A)跟蹤哪些物理行和列未被使用,並且在添加時可以分配給新的邏輯行和列。

B)根據您的用例,可能還需要將物理行和列映射回虛擬行和列號。

這兩項都是非常簡單,直接的任務,可以作為您的家庭作業。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM