如何通过在Matlab中置换子对角元素来生成所有二进制矩阵

时间:2013-07-17 18:33:00

标签: matlab

我感兴趣的是只考虑对子对角线条目的更改,因为我总是让对角线和上三角形条目为零。排列总数的闭合公式为2 ^(n选择2)。对于n = 4的情况,我有

         d_1

        x(2,1)   d_2
   X=        
        x(3,1)  x(3,2)  d_3   

        x(4,1)  x(4,2) x(4,3)  d_4

其中上三角形条目和d_i已经等于零。

我知道将有64种不同的矩阵,但我如何为任何n生成它们?

2 个答案:

答案 0 :(得分:0)

  1. 首先从filexchange下载combn(http://www.mathworks.com/matlabcentral/fileexchange/7147-combn-4-3

  2. 此功能可以解决您的问题(它使用上面的组合)。输出将是一个三维数组。

  3. tril_combs.m

    function out = tril_combs(n)
    
    n_combs = [n^2 - n]/2;
    combs = combn([0 1], n_combs);
    out = zeros(n, n, n_combs);
    
    for mat = 1:size(combs,1)
        current = zeros(n);
        k = 0;
        for i = 2:n
            for j = 1:(i-1)
                k = k + 1;
                current(i,j) = combs(mat,k);
            end
        end
        out(:,:,mat) = current;
    end
    

答案 1 :(得分:0)

首先,弄清楚如何提取/放置子对角元素。怎么样:

sub_idx = find(~triu(ones(n)));

现在使用这个索引向量作为二进制值到子对角线的永久映射。现在,我们需要的是一个包含所有可能二进制值的矩阵:

num_combs = 2^length(sub_idx);
binary_combs = dec2bin(0:num_combs-1).' - '0';

现在第k个组合矩阵是:

mtx = zeros(n);
mtx(sub_idx) = binary_combs(:,k);

(编辑添加单输出矩阵选项)

如果你想将它们全部放在一个大的3D矩阵中,那么:

tmp = zeros(n*n, num_combs);
tmp(sub_idx, :) = binary_combs;
mtx = reshape(tmp, [n n num_combs]);