如何實現多維數組的行 / 列按照 index 訪問都得到連續內存?

比如一維數組

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。

3. Hilbert curve


【請問有沒有辦法可以實現「無論按照行或列訪問都能得到連續內存地址"呢?

】沒有

【推廣到高維,這個需求就是按照任意維度訪問都得到連續內存地址,可以嗎?】不可以,除非內存和cpu的cache的維度不低於你的數組的維度(主要是cache的演算法,跟硬體關係不大)

【如果不可以,請問在matlab或者numpy裡面類似的操作是怎麼實現的?】他們是不連續的,只是給你創建了一個view,並不一定都返回一個數組的指針。


其實是樓上的思路。。。

比如說二維數組,內存裡面按列主序和行主序分別放兩份數據,按列訪問時讀取列主序,按行訪問時讀取列主序。。這樣似乎可以推到高維的情況。

這樣來做的話,修改數組的一個元素就需要更多的操作了,不過樓主只問了讀取的情況。


你是說,要訪問一個矩陣的某一行向量列向量嗎?

Matlab里有這兩個表達式。

別的語言里,再不濟,可以自己寫這兩個函數實現之。

還有兩個奇怪的思路:

1.轉置矩陣,然後把行當作列來訪問。

2.康托爾配對函數。/*個人覺得這個是無敵的*/


如果地址分段設計,比如一個完整的地址是a|b,對於行而言,ab是連續地址,對於列,a值域可視為連續。貌似二維是有可能構造定址演算法。是否可以推廣至高維情況,貌似有設計空間,但可能會浪費一些內存。

可能與題主初衷有出入。


推薦閱讀:

matlab有類似c語言struct又能用tabulate處理的類型嗎?
matlab中,一個m文件為什麼設計成只能定義一個函數?
電動汽車基於模型設計的實現思路是怎樣的?
有哪些 Matlab 代碼分享網站?
如何看待有人在知乎上問具體如何編程的問題?

TAG:MATLAB | C編程語言 | CC | 演算法與數據結構 | numpy |