如何在Matlab中通过排列次对角元素生成全二元矩阵
我感兴趣的只是考虑对次对角项的更改,因为我总是让对角项和上三角项为零。置换总数的闭合公式为2^(n选择2)。对于n=4的情况,我有如何在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
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生成它们
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)
来获得次对角线元素。