【发布时间】:2023-04-01 18:08:01
【问题描述】:
我需要为一个矩阵创建所有可能的置换矩阵,其中每个置换矩阵在每列和每行中仅包含一个 1,在所有其他位置包含 0。
例如,(1) 中的示例是 2x2 矩阵的所有可能置换矩阵,(2) 中的示例是 3x3 矩阵的所有可能置换矩阵,依此类推
那么如何在 MATLAB 中获取矩阵 NxN 的这些矩阵并将它们存储到一个三维矩阵中?
【问题讨论】:
标签: matlab matrix permutation
我需要为一个矩阵创建所有可能的置换矩阵,其中每个置换矩阵在每列和每行中仅包含一个 1,在所有其他位置包含 0。
例如,(1) 中的示例是 2x2 矩阵的所有可能置换矩阵,(2) 中的示例是 3x3 矩阵的所有可能置换矩阵,依此类推
那么如何在 MATLAB 中获取矩阵 NxN 的这些矩阵并将它们存储到一个三维矩阵中?
【问题讨论】:
标签: matlab matrix permutation
这是我的解决方案,使用 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
【讨论】:
n = 64,您所需的输出矩阵的维度为[64, 64, factorial(64)]。现在,factorial(64) 类似于1.2689e+89。这是您需要的大量内存,与生成此矩阵的代码无关。你真的需要在一个时间点上所有可能的排列矩阵吗?否则,您可以迭代排列的子集。或者,像往常一样处理巨大的矩阵时,购买更多的 RAM...
使用repelem、perms 和reshape:
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。
【讨论】: