如何實現多維數組的行 / 列按照 index 訪問都得到連續內存?
01-04
比如一維數組
int a[1024];從a[0]開始就是一個連續的內存二維數組在C/C++裡面如果按照行訪問會得到一個連續內存地址.在Fortran裡面按列訪問會得到一個連續的內存.請問有沒有辦法可以實現「無論按照行或列訪問都能得到連續內存地址"呢? 推廣到高維,這個需求就是按照任意維度訪問都得到連續內存地址,可以嗎?如果不可以,請問在matlab或者numpy裡面類似的操作是怎麼實現的?
這問題可以不嚴格地轉化為:給定二維及更高維的柵格,能不能把一根繩子放置在裡面,令繩子通過每個柵格僅一次,而又能另繩子通過每對相鄰的柵格。顯然答案是不可以。
但是有一些方法,可能會令相鄰柵格的繩子距離平均一些,例如
1. Tiling,常用於矩陣乘法,可增加locality,改善cache coherence。
2. Z-order curve (又作Morton order),廣泛應用在GPU的紋理存儲上(有時稱為texture swizzling),提高locality。【請問有沒有辦法可以實現「無論按照行或列訪問都能得到連續內存地址"呢?
】沒有【推廣到高維,這個需求就是按照任意維度訪問都得到連續內存地址,可以嗎?】不可以,除非內存和cpu的cache的維度不低於你的數組的維度(主要是cache的演算法,跟硬體關係不大)
【如果不可以,請問在matlab或者numpy裡面類似的操作是怎麼實現的?】他們是不連續的,只是給你創建了一個view,並不一定都返回一個數組的指針。
其實是樓上的思路。。。
比如說二維數組,內存裡面按列主序和行主序分別放兩份數據,按列訪問時讀取列主序,按行訪問時讀取列主序。。這樣似乎可以推到高維的情況。
這樣來做的話,修改數組的一個元素就需要更多的操作了,不過樓主只問了讀取的情況。你是說,要訪問一個矩陣的某一行向量或列向量嗎?
Matlab里有這兩個表達式。別的語言里,再不濟,可以自己寫這兩個函數實現之。還有兩個奇怪的思路:1.轉置矩陣,然後把行當作列來訪問。2.康托爾配對函數。/*個人覺得這個是無敵的*/如果地址分段設計,比如一個完整的地址是a|b,對於行而言,ab是連續地址,對於列,a值域可視為連續。貌似二維是有可能構造定址演算法。是否可以推廣至高維情況,貌似有設計空間,但可能會浪費一些內存。
可能與題主初衷有出入。推薦閱讀:
※matlab有類似c語言struct又能用tabulate處理的類型嗎?
※matlab中,一個m文件為什麼設計成只能定義一個函數?
※電動汽車基於模型設計的實現思路是怎樣的?
※有哪些 Matlab 代碼分享網站?
※如何看待有人在知乎上問具體如何編程的問題?