我有一个名为nghlist(i,j)的50x50矩阵,包含0和1个值。 1表示(i,j)之间存在关系。
还有另一个名为chlist的5x50矩阵。
我需要检查nghlist矩阵,如果i和j之间有任何连接(nghlist(i,j)== 1)那么我需要转到chlist矩阵并比较第i列和第j列的值。例如,比较列(1,3,8,21,52)并获取它们共享的相似值。即我发现所有这些列都有3个相似的值。
我尝试使用以下代码。但问题是我需要比较未知的列数(取决于节点连接(nghlist),例如4或5列)。
for i=1:1:n
for j=1:1:n
if (i~=j & nghlist(i,j)==1)
sum(ismember(chlist(:,i),chlist(:,j)));
end
end
end
非常感谢任何帮助。
++++简化示例++++++ 看一下示例http://i.imgur.com/mQjDqzz.jpg
nghlist矩阵:
1 1 1 0 0
1 1 1 0 0
1 1 1 1 1
0 0 1 1 1
0 0 1 1 1
chlist matrix:
3 1 4 5 4
4 3 5 6 5
5 4 6 7 6
在此示例中,由于节点1连接到节点2和3,因此我需要比较chlist中的列1,2和3。输出为1(因为它们只共享值'4')。
节点5的值为2(因为列3,4和5只共享值'5'和'6')。我希望现在很清楚。
答案 0 :(得分:0)
让我们说,要比较的列的索引称为idxList:
idxList = [1,3,8,21,50];
您可以将所有内容与第一个进行比较,然后使用“AND”查找共享值的最小数量:
shared = ones(size(chlist(:,i)))
for ii = 2:length(idxList)
shared = (shared == (chlist(:,idxList(1)) == chlist(:,idxList(ii))))
end
最后,和以前一样总结
sum(shared)
我没有检查确切的代码,但概念应该变得清晰。
答案 1 :(得分:0)
如果您的简化示例的结果是[1,2,0,3,2],那么以下代码对我有效。 (Matrix a 代表 nghlist ,矩阵 b 代表 chlist ,结果存储在 s )
for i = 1:size(a,1)
s(i)=0;
row = a(i,:);
idx = find(row==1);
idx = idx(idx~=i);
tempb = b(:,idx);
for j=1:size(tempb,1)
if sum(sum(tempb==tempb(j,1)))==size(tempb,2)
s(i)=s(i)+1;
end
end
end
对于每个节点,您找到其行中的所有节点,然后丢弃指向节点本身的节点。选择适当的chlist列(第6行)并创建一个新矩阵。对于此矩阵的第1列的每个元素,检查它是否存在于所有其他列中。如果存在,则更新s值
答案 2 :(得分:0)
我设法以这种方式解决它。我比较了tempb的第一列和第二列,并将结果放在tem中。然后将tem与第三列tempb进行比较,依此类推。无论如何,谢谢 finmor 以及 pyStarter ,您的代码激发了我的灵感。但是我知道它不是最好的方法,但至少它是有效的。
for i=1:size(nghlist,1)
s(i)=0;
j=2;
row=nghlist(i,:);
idx=find(row==1);
tempb=chlist(:,idx);
if (size(tempb,2)>1)
tem=intersect(tempb(:,1),tempb(:,2));
if (size(tempb,2)<=2)
s(i)=size(tem,1);
end
while (size(tempb,2)>j & size(tem)~=0)
j=j+1;
tem= intersect(tem(:,1),tempb(:,j));
s(i)=size(tem,1);
end
end
end