通过索引来反转数组的混乱

时间:2018-03-29 19:48:54

标签: arrays matlab sorting indexing vectorization

我有一个矩阵,其列根据某个索引进行了混洗。我知道想要找到将数组“解开”回到其原始状态的索引。 例如:

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的任何想法?另外,有没有比在循环中更好地排列数组的方法?

1 个答案:

答案 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;