通过从邻接矩阵添加向量来将值分配给矩阵

时间:2017-07-01 08:01:39

标签: matlab matrix combinatorics adjacency-matrix matrix-indexing

Matlab很新,我通常使用STATA。

我想使用nchoosek函数来获取一个矩阵中的向量之和。

我有一个21x21的邻接矩阵,输入为0或1。我想创建一个新的矩阵,它将给出一个来自邻接矩阵的所有可能三元组之间的输入总和。

新矩阵看起来应该有四个变量,索引(i,j,k) - 对应于21x21的每个组合。最后一个变量是输入的总和。

我到目前为止的代码是:

C = nchoosek(21,3)
B = zeros(nchoosek(21,3), 4)
for i=1:C
    for j=i+1:C
        for k=j+1:C
            B(?)=B(i, j, k, A(i)+A(j)+A(k)) #A is the 21x21 adj mat
        end
    end
end

我知道我的赋值语句不正确,因为我没有完成理解“:”运算符的索引角色。任何帮助将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:0)

这可能是你想要的:

clear all
close all
clc

A = rand(21,21); % Replace this with actual A
rowNum = 0;
for i=1:21
    for j=i+1:21
        for k=j+1:21
            rowNum = rowNum+1;
            B(rowNum,:) = [i, j, k, sum(A(:,i)+A(:,j)+A(:,k))];
        end
    end
end

有一些观点:

  • 循环播放不同的组合。组合总数为nchoosek(21,3),您可以在3个嵌套循环后检查。您使用for i=1:C的代码是第一个错误,因为您实际上针对i的不同值以及jk的不同值进行了循环。所以这些只有21个值而不是更多。
  • 为了避免重复组合,它足以在您之前的代码中实现的前一个索引之后启动新索引。
  • 还有其他可能的方法,例如矢量化格式,但为了坚持你的方法,我使用了一个计数器:rowNum,它是循环计数器并沿循环更新。
  • B(rowNum,:)表示矩阵B的rowNum"行的所有元素。

答案 1 :(得分:0)

下面是一个在邻接矩阵中查找三元组的算法。它会检查所有可能的三元组并对值进行求和。

%basic adjacency matrix with two triads (1-2-5) (2-3-5)
A=[];
A(1,:) = [0 1 0 0 1];
A(2,:) = [1 0 1 0 1];
A(3,:) = [0 1 0 0 1];
A(4,:) = [0 0 0 0 1];
A(5,:) = [1 1 1 1 0];
A=A==1; %logical matrix

triads=nchoosek(1:5,3);
S=nan(size(triads,1),4);
for ct = 1:size(triads,1)
    S(ct,1:3)=[A(triads(ct,1),triads(ct,2)),A(triads(ct,1),triads(ct,3)),A(triads(ct,2),triads(ct,3))];
    S(ct,4)=sum(S(ct,1:3));
end
triads(find(S(:,4)==3),:)

ans =

 1     2     5
 2     3     5