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
我知道我的赋值语句不正确,因为我没有完成理解“:”运算符的索引角色。任何帮助将不胜感激。
谢谢!
答案 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
的不同值以及j
和k
的不同值进行了循环。所以这些只有21个值而不是更多。 答案 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