0

我有兴趣只考虑对下对角线条目的更改,因为我总是让对角线和上三角形条目为零。排列总数的封闭公式为 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 生成它们?

4

2 回答 2

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

  2. 此功能应该可以解决您的问题(它使用上面的 combn )。输出将是一个 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
于 2013-07-17T19:36:31.393 回答
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]);
于 2013-07-17T19:40:59.233 回答