如何在Matlab中通过排列次对角元素生成全二元矩阵

如何在Matlab中通过排列次对角元素生成全二元矩阵,matlab,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 上面的三角形项和dui已经等于零了 我知道会有64个不同的矩阵,但如何为任意n生成它们 首先,从filexchange()下载comb

我感兴趣的只是考虑对次对角项的更改,因为我总是让对角项和上三角项为零。置换总数的闭合公式为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
上面的三角形项和dui已经等于零了

我知道会有64个不同的矩阵,但如何为任意n生成它们

  • 首先,从filexchange()下载combn

  • 这个函数应该可以解决您的问题(它使用上面的combn)。输出将是一个三维数组

  • 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
    

    首先,找出如何提取/放置次对角线元素。那就:

    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]);
    

    这些不是排列(即重新排序),而是组合()。否则我对Mathlab一无所知,抱歉。可能是有兴趣的?要获得次对角元素的所有可能的排序,您需要使用permute和perms。然而,当要排列的元素数不超过10且这意味着n=5时,此问题可以切实解决。你需要详细说明你想要什么类型的“组合”。你可以使用
    tril(…,-1)
    来获得次对角线元素。