【问题标题】:reversing shuffling of array by indexing通过索引反转数组的改组
【发布时间】:2018-03-29 19:48:54
【问题描述】:

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

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

【问题讨论】:

    标签: arrays matlab sorting indexing vectorization


    【解决方案1】:

    您只需拨打sort即可获得myUnshufflingIndex

    [~, myUnshufflingIndex] = sort(myShufflingIndex, 1);
    

    或者,您甚至不需要计算 myUnshufflingIndex,因为您可以在分配的左侧使用 myShufflingIndex 来解乱数据:

    for x = 1:3
      myUnShuffledArray(myShufflingIndex(:, x), x) = myShuffledArray(:, x);
    end
    

    如果您想在 unshuffle 时避免 for 循环,您可以通过向索引的每一列添加偏移量来对其进行矢量化,将其转换为 linear indices 的矩阵,而不仅仅是行索引:

    [nRows, nCols] = size(myShufflingIndex);
    myUnshufflingIndex = myShufflingIndex+repmat(0:nRows:(nRows*(nCols-1)), nRows, 1);
    myUnShuffledArray = nan(nRows, nCols);  % Preallocate
    myUnShuffledArray(myUnshufflingIndex) = myShuffledArray;
    

    【讨论】:

      猜你喜欢
      • 2018-06-25
      • 2018-05-02
      • 1970-01-01
      • 2018-12-24
      • 2021-12-01
      • 1970-01-01
      • 2018-07-27
      • 2022-11-05
      • 1970-01-01
      相关资源
      最近更新 更多