【问题标题】:All possible 0 and 1 matrices of a normal graph正态图的所有可能的 0 和 1 矩阵
【发布时间】:2017-11-17 00:52:20
【问题描述】:

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

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。

如何重写函数来做到这一点?我知道它需要某种形式的添加三角矩阵及其转置的自我,但我无法将它拼凑在一起。谢谢!

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    它可能会更简洁,但以下内容可以满足您的要求。

    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(:);
    

    【讨论】:

    • 完美!谢谢。
    【解决方案2】:

    与@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
    

    【讨论】:

    • 此代码的唯一问题是反射没有正确填充到最终矩阵中。例如:这将返回 [0 0 1; 的最终矩阵; 1 0 1; 1 0 0] 而不是 [0 0 1; 0 0 1; 1 1 0]。谢谢!
    • 好的,这取决于你如何定义对称性。立即查看我的编辑
    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    相关资源
    最近更新 更多