讓我們說你有一個一維矩陣MATLAB通過索引排序的2D和3D矩陣和訪問
a = rand(1,5);
[sa i] = sort(a);
然後sa
和a(i)
是相同的。然而,如果基質的尺寸增加
a = rand(3,4);
[sa i] = sort(a);
然後sa
和a(i)
是不一樣的。而當我嘗試按照第三維排序3D矩陣時也會發生同樣的情況。
如何通過索引i
訪問a
的值?換句話說,我該如何計算sa=a(X)
,X
應該是什麼?
編輯:
感謝您的解決方案。但是,當您更改維度進行排序時,它們不起作用。不過,我拿起這個想法並用它來構建一個通用表單。
算法做的是建立矩陣的索引。 MATLAB明確列出單元格列。因此,索引是由
idx = r + (c-1)*ROWS + (p-1)*ROWS*COLS
其中,idx
給出是索引,r
是行位置,c
是列位置,並且p
是頁位置。
因此,如果我們在第一維(普通sort(a)
)中排序,結果索引是列中的位置;如果我們在第二維中排序,結果索引是行中的位置;如果我們在第三維中排序,那麼結果索引就是頁面位置。這是說,它只能維持生產行列數爲給定的情況下:
r = repmat((1:rows)',[1 cols pages]);
c = repmat(1:cols,[rows 1 pages]);
在第一維排序中給出的解決方案進行了說明。隨後,讓在第二維二維數組排序(行明智)現在
a = rand(4,5);
[rows cols pages] = size(a);
R = repmat((1:rows)',[1 cols pages]);
[sa idx] = sort(a,2);
nIdx = R + (idx-1)*rows;
isequal(sa,a(nIdx))
,如果我們使用同樣的想法在第三維度排序(頁明智的),我們需要做的
a = rand(4,5,3);
[rows cols pages] = size(a);
R = repmat((1:rows)',[1 cols pages]);
C = repmat(1:cols,[rows 1 pages]);
[sa idx] = sort(a,3);
nIdx = R + (C-1)*rows + (idx-1)*rows*cols;
isequal(sa,a(nIdx))
而且可以使用相同的邏輯將其擴展到N維。 感謝您的幫助,您點亮了方向。 :)
爲2D和3D最好的答案就在這裏。 – Trefex 2014-05-26 09:53:52