【问题标题】:MATLAB - Permutations of random indices in specific areas of a gridMATLAB - 网格特定区域中随机索引的排列
【发布时间】:2016-12-06 19:05:33
【问题描述】:

我有一个问题,我在 100x100 的零网格上有 4 个对象 (1),这些零网格被分成 16 个 25x25 的偶数正方形。 我需要创建一个 (16^4 * 4) 表,其中的条目列出了这 4 个对象中每一个在 16 个子矩阵中的所有可能位置。只要对象不相互重叠,对象就可以位于子矩阵中的任何位置。这显然是一个置换问题,但由于索引和位置必须是随机的但在第 16 个方格内不重叠的事实而增加了复杂性。会喜欢任何指针!

我试图做的是创建一个名为“top_left_corner(position)”的函数,它返回您所在的子矩阵左上角的下标。例如top_left_corner(1) = (1,1), top_left_corner(2) = (26,1) 等等。然后我有:

        pos = randsample(24,2);
        I = pos(1)+top_left_corner(position,1);
        J = pos(2)+top_left_corner(position,2);

问题是如何在表中生成并存储它的排列作为线性索引。

【问题讨论】:

    标签: algorithm matlab permutation


    【解决方案1】:

    首先使用ndgrid[4 , 16^4] 矩阵perm 的形式生成的笛卡尔积。然后在while循环中生成随机数并添加到perm。如果 perm 的任何列包含重复的随机数,则为这些列重复随机数生成,直到没有列具有重复的元素。通常不需要超过 2-3 次迭代。由于 [100 ,100] 数组分为 16 个块,因此使用 kron 生成的 16 个块的索引模式以及提取的已排序元素的 sort 函数索引。然后生成随机数形成模式的索引(16个块)。

    C = cell(1,4);
    [C{:}]=ndgrid(0:15,0:15,0:15,0:15);
    perm = reshape([C{:}],16^4,4).';
    
    perm_rnd = zeros(size(perm));
    c = 1:size(perm,2);
    while true
        perm_rnd(:,c) = perm(:,c) * 625 +randi(625,4,numel(c));
        [~ ,c0] = find(diff(sort(perm_rnd(:,c),1),1,1)==0);
        if isempty(c0)
            break;
        end
        %c = c(unique(c0));
        c = c([true ; diff(c0)~=0]);
    end
    pattern = kron(reshape(1:16,4,4),ones(25));
    
    [~,idx] = sort(pattern(:));
    result = idx(perm_rnd).';
    

    【讨论】:

    • 哇!谢谢你,那真是太棒了。真的很感激:)
    • 我可能会补充一点,我最终做了一些不同的事情来生成“perm_rnd”,因为它没有完全得到我需要的排列。 '范围 = 0:15;组合= permn(范围,4);烫发=转置(组合); perm_rnd = zeros(大小(perms));'它正在使用可以找到的 permn 函数here
    • 没有区别。都从 numel(0:15)>4 生成笛卡尔积
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 2012-10-14
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多