【问题标题】:Smarter way to generate a matrix of zeros and ones in Matlab在 Matlab 中生成零和一矩阵的更智能方法
【发布时间】:2016-05-19 09:24:40
【问题描述】:

我想生成n 节点的无向​​图的所有可能的邻接矩阵(零对角线)。

例如,没有对n=3 重新标记,我们得到 23(3-1)/2 = 8 个可能的网络配置(或邻接矩阵)。

一种适用于n = 3(我认为这很愚蠢)的解决方案如下:

n = 3;
A = [];
for k = 0:1
    for j = 0:1
        for i = 0:1
            m = [0 , i , j ; i , 0 , k ; j , k , 0 ];
            A = [A, m];
        end
    end
end

此外,我认为以下似乎更快,但我的索引有问题,因为缺少 2 个矩阵:

n = 3
C = [];
E = [];

A = zeros(n);

for i = 1:n
    for j = i+1:n
        A(i,j) = 1;
        A(j,i) = 1;
        C = [C,A];
    end
end

B = ones(n);
B = B- diag(diag(ones(n)));
for i = 1:n
    for j = i+1:n
        B(i,j) = 0;
        B(j,i) = 0;
        E = [E,B];
    end
end

D = [C,E]

有更快的方法吗?

【问题讨论】:

  • 科迪有几个这样的问题
  • @CarlWitthoft 非常感谢您

标签: matlab optimization matrix nodes graph-theory


【解决方案1】:

我肯定会用二进制编码生成邻接矩阵的非对角元素:

n = 4;  %// number of nodes
m = n*(n-1)/2;
offdiags = dec2bin(0:2^m-1,m)-48; %//every 2^m-1 possible configurations

如果您有统计和机器学习工具箱,那么squareform 会轻松地为您一一创建矩阵:

%// this is basically a for loop
tmpcell = arrayfun(@(k) squareform(offdiags(k,:)),1:size(offdiags,1),...
                 'uniformoutput',false);
A = cat(2,tmpcell{:}); %// concatenate the matrices in tmpcell

虽然我会考虑沿维度3 连接,但您可以单独方便地查看每个矩阵。

或者,您可以自己以矢量化方式进行数组合成,它可能更快(以更多内存为代价):

A = zeros(n,n,2^m);
%// lazy person's indexing scheme:
[ind_i,ind_j,ind_k] = meshgrid(1:n,1:n,1:2^m);
A(ind_i>ind_j) = offdiags.'; %'// watch out for the transpose

%// copy to upper diagonal:
A = A + permute(A,[2 1 3]);  %// n x n x 2^m matrix

%// reshape to n*[] matrix if you wish
A = reshape(A,n,[]);         %// n x (n*2^m) matrix

【讨论】:

  • 太棒了!非常感谢!
  • 你好,有没有办法从生成的列表中删除一些矩阵?对于 n=6 我得到 32768 但在我的模型中每个矩阵中的所有条目子矩阵 A(1:2,1:2,i) 和 A(3:6,3:6,i) 只有零条目。我尝试了按照您建议的方式生成矩阵的直接方法,然后将提及的子矩阵的条目设置为零。然后我搜索相同的矩阵并试图找到一种方法来删除成千上万的重复矩阵(理想情况下,我想采用生成矩阵的“交集”)。非常感谢你
  • @Sha 如果您不首先创建这些矩阵,它可能是最简单和最有效的。我的意思是你应该使用offdiags。找到那些应该为 0 的元素(例如,块 A(1:2,1:2,i) 指的是来自 offdiags(1) 的元素 A(1,2,i)A(3,4:6,i) 来自 offdiags(k:k+2),其中 k=(n-1)+(n-2)+1 等)。首先将offdiags 中的这些列清零,然后从unique(offdiags,'rows') 创建A,这将为您选择独特的配置。让我知道这是否清楚。
  • @Sha 抱歉,我之前的评论当然是指offdiags(:,k:k+2) 等,所以你需要考虑offdiags 的完整列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多