我有兴趣只考虑对下对角线条目的更改,因为我总是让对角线和上三角形条目为零。排列总数的封闭公式为 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^( 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 生成它们?
首先从 filexchange 下载 combn ( http://www.mathworks.com/matlabcentral/fileexchange/7147-combn-4-3 )
此功能应该可以解决您的问题(它使用上面的 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
首先,弄清楚如何提取/放置次对角元素。怎么样:
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]);