【问题标题】:How to get all possible permutation matrices of a matrix如何获得矩阵的所有可能的置换矩阵
【发布时间】:2023-04-01 18:08:01
【问题描述】:

我需要为一个矩阵创建所有可能的置换矩阵,其中每个置换矩阵在每列和每行中仅包含一个 1,在所有其他位置包含 0。

例如,(1) 中的示例是 2x2 矩阵的所有可能置换矩阵,(2) 中的示例是 3x3 矩阵的所有可能置换矩阵,依此类推

那么如何在 MATLAB 中获取矩阵 NxN 的这些矩阵并将它们存储到一个三维矩阵中?

【问题讨论】:

    标签: matlab matrix permutation


    【解决方案1】:

    这是我的解决方案,使用 implicit expansion(使用 Octave 5.2.0 和 MATLAB Online 测试):

    n = 3;
    
    % Get all permutations of length n
    p = perms(1:n);
    
    % Number of permutations
    n_p = size(p, 1);
    
    % Set up indices, where to set elements to 1
    p = p + (0:n:n^2-1) + (0:n^2:n^2*n_p-1).';
    
    % Set up indices, where to set elements to 1 (for MATLAB R2016a and before)
    %p = bsxfun(@plus, bsxfun(@plus, p, (0:n:n^2-1)), (0:n^2:n^2*n_p-1).');
    
    % Initialize 3-dimensional matrix
    a = zeros(n, n, n_p);
    
    % Set proper elements to 1 
    a(p) = 1
    

    n = 3 的输出:

    a =
    
    ans(:,:,1) =
    
       0   0   1
       0   1   0
       1   0   0
    
    ans(:,:,2) =
    
       0   1   0
       0   0   1
       1   0   0
    
    ans(:,:,3) =
    
       0   0   1
       1   0   0
       0   1   0
    
    ans(:,:,4) =
    
       0   1   0
       1   0   0
       0   0   1
    
    ans(:,:,5) =
    
       1   0   0
       0   0   1
       0   1   0
    
    ans(:,:,6) =
    
       1   0   0
       0   1   0
       0   0   1
    

    【讨论】:

    • 你打败了我!
    • @Ander 等待 Luis 出色的单线解决方案。 ;-)
    • @HansHirse 当设置 n = 64 或 128 时,我无法运行这个程序,因为它需要巨大的硬件!有没有办法用更小的硬件要求来制作它?
    • @New_student 对于n = 64,您所需的输出矩阵的维度为[64, 64, factorial(64)]。现在,factorial(64) 类似于1.2689e+89。这是您需要的大量内存,与生成此矩阵的代码无关。你真的需要在一个时间点上所有可能的排列矩阵吗?否则,您可以迭代排列的子集。或者,像往常一样处理巨大的矩阵时,购买更多的 RAM...
    • 是否可以修改答案以一一拥有它们? @HansHirse
    【解决方案2】:

    使用repelempermsreshape

    n   = 3;                                 % matrix size 
    f   = factorial(n);                      % number of permutation
    rep = repelem(eye(n),1,1,f)              % repeat n! time the diagonal matrix
    res = reshape(rep(:,perms(1:n).'),n,n,f) % indexing and reshaping
    

    res 在哪里:

    res =
    
    ans(:,:,1) =
    
       0   0   1
       0   1   0
       1   0   0
    
    ans(:,:,2) =
    
       0   1   0
       0   0   1
       1   0   0
    
    ans(:,:,3) =
    
       0   0   1
       1   0   0
       0   1   0
    
    ans(:,:,4) =
    
       0   1   0
       1   0   0
       0   0   1
    
    ans(:,:,5) =
    
       1   0   0
       0   0   1
       0   1   0
    
    ans(:,:,6) =
    
       1   0   0
       0   1   0
       0   0   1
    

    根据您的评论:

    我需要做的是将矩阵即 Z 与所有可能的 置换矩阵并选择该置换矩阵 得到 tr(Y) 最小值;其中 Y 是乘法的结果 Z 与置换矩阵。我认为我不需要生成所有 置换矩阵并将它们存储在这样的变量中,我可以生成 他们一一得到乘法的结果。那可能吗 ?

    您正在尝试解决分配问题,您可以使用众所周知的hungarian algorithm多项式时间内解决此任务。无需生成置换矩阵的 googleplex。

    【讨论】:

    • 如何将其应用于上述问题?你有什么想法吗?
    • 你读过维基百科的文章吗?有一步一步的例子。
    • 是的,我已经检查过了,但我无法想象如何为我的问题实施它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多