我感兴趣的是只考虑对子对角线条目的更改,因为我总是让对角线和上三角形条目为零。排列总数的闭合公式为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生成它们?
答案 0 :(得分:0)
首先从filexchange下载combn(http://www.mathworks.com/matlabcentral/fileexchange/7147-combn-4-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]);