|
在MATLAB中,(:) 有一個超級簡單但極強的功能:把任意維數(shù)的數(shù)組按列優(yōu)先拉平成一個列向量。 無論A原來是
只要你寫:v = A(:); 你就得到了一個1列向量。 由于MATLAB的底層存儲是column-major(Fortran存儲方式),也就是我們知道的“列優(yōu)先”,A的內(nèi)存排布是: A(:,1), A(:,2), A(:,3), ... 依次排布 所以(:) 實際上是把內(nèi)存順序完全平鋪出來,零開銷、非??臁R虼?/span>(:) “一鍵拉直”的價值在于把復雜的多維問題變成 1D 處理:
(:) 的常用搭檔:reshape 如果你把矩陣拉直了,還想重新變回去或者改變維度: A1 = reshape(v, size(A));B = reshape(A, new_rows, new_cols);Matlab 中 reshape 不改變底層數(shù)據(jù),只改變“視圖”(維度解釋方式),例如:A = reshape(1:8, [2 4]) 的內(nèi)存是 [1 2 3 4 5 6 7 8],只不過被解釋成了:
使用(:) 展平實際上就是“把視圖變回一維”。 使用reshape的元素數(shù)量必須一致,否則會報錯,并且reshape后的矩陣任然是按列優(yōu)先構(gòu)造的,理解了這個,你對所有維度變換都會立刻做到“不用試就知道結(jié)果”。 應(yīng)用場景1:矩陣按條件修改(不想寫for),例如你把超過閾值的所有點壓成th,無需循環(huán),也不需要 find: th = 0.5;A = rand(1024, 4096);v = A(:);v(v > th) = th;A2 = reshape(v, size(A));應(yīng)用場景2:對某個維度做操作,但算法更適合 1D 寫,例如你想對矩陣所有元素歸一化,多維矩陣的全局歸一化變得非常優(yōu)雅:
由于底層線性數(shù)據(jù)不動,reshape(A,3,2) 只是把這段數(shù)據(jù)按新的維度解釋,并沒有復制數(shù)據(jù)的操作,因此速度極快(O(1)的操作),在你做復雜數(shù)據(jù)維度變換時無需擔心性能。 |
|
|