我有一个矩阵,其列根据某个索引进行了混洗。我知道想要找到将数组“解开”回到其原始状态的索引。 例如:
myArray = [10 20 30 40 50 60]';
myShuffledArray = nan(6,3)
myShufflingIndex = nan(6,3)
for x = 1:3
myShufflingIndex(:,x) = randperm(length(myArray))';
myShuffledArray(:,x) = myArray(myShufflingIndex(:,x));
end
现在我想找到一个矩阵myUnshufflingIndex
,它可以反转混乱以获得数组myUnshuffledArray = [10 20 30 40 50 60; 10 20 30 40 50 60; 10 20 30 40 50 60]'
我希望以下列方式使用myUnshufflingIndex
:
for x = 1:3
myUnShuffledArray(:,x) = myShuffledArray(myUnshufflingIndex(:,x), x);
end
例如,如果myShufflingIndex = [2 4 6 3 5 1]'
中有一列,则myUnshufflingIndex
中的相应列为[6 1 4 2 5 3]'
关于如何以整洁的矢量化方式获得myUnshufflingIndex
的任何想法?另外,有没有比在循环中更好地排列数组的方法?
答案 0 :(得分:3)
只需拨打一次sort
即可获得myUnshufflingIndex
:
[~, myUnshufflingIndex] = sort(myShufflingIndex, 1);
或者,您甚至不需要计算myUnshufflingIndex
,因为您可以在作业的左侧使用myShufflingIndex
来取消对数据的处理:
for x = 1:3
myUnShuffledArray(myShufflingIndex(:, x), x) = myShuffledArray(:, x);
end
如果您想在非抽屉时避免使用for循环,可以通过向索引的每一列添加偏移量来对其进行矢量化,将其转换为linear indices的矩阵,而不仅仅是行索引:< / p>
[nRows, nCols] = size(myShufflingIndex);
myUnshufflingIndex = myShufflingIndex+repmat(0:nRows:(nRows*(nCols-1)), nRows, 1);
myUnShuffledArray = nan(nRows, nCols); % Preallocate
myUnShuffledArray(myUnshufflingIndex) = myShuffledArray;