普通图的所有可能的0和1矩阵

时间:2017-11-16 00:32:59

标签: matlab matrix

为了更好地解释我的需要,这是我的第一个代码:

function allpos = f1(x)
allpos=reshape(permute((dec2base(0:power(2,x*x)-1,2)-'0'),[3 2 1]),x,x,[]);

这段代码完全符合我的需要。如果用户输入f1(2),则会返回从[0 0; 0 0][1 1; 1 1]的每个矩阵。但是,它也给了我很多无用的矩阵。我只想要在对角线上镜像的矩阵,对角线上只有零。

更简单地说,对于f1(3),我只想要 [0 0 0; 0 0 0; 0 0 0][0 1 1; 1 0 1; 1 1 0]。这意味着如果我运行新的f1(3);它将返回8个矩阵,而不是512.

如何重写函数来执行此操作?我知道它需要某种类型的三角形矩阵和它的转换自我,但我不能把它拼凑在一起。谢谢!

2 个答案:

答案 0 :(得分:0)

它可能会更简洁,但以下是您所要求的。

function allpos = f1(x)
N = (x-1)*x / 2;
z = permute(dec2base(0:power(2,N)-1,2)-'0',[3 2 1]);
allpos = zeros(x,x,power(2,N));
idx = repmat(logical(tril(ones(x),-1)),[1,1,power(2,N)]);
allpos(idx) = z(:);
allpos = permute(allpos,[2 1 3]);
allpos(idx) = z(:);

答案 1 :(得分:0)

@ jodag的类似解决方案,但更简洁......

function allops=f1(x)
allops=zeros(x,x,2^(sum(1:x-1)));
allops(find(triu(ones(x),1))+x^2*(0:2^(sum(1:x-1))-1))=[dec2base(0:2^(sum(1:x-1))-1,2)-'0'].';
allops=allops+permute(allops,[2 1 3])
end