将多列矩阵进行比较

时间:2013-11-29 08:39:43

标签: matlab matrix

我有一个名为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')。我希望现在很清楚。

3 个答案:

答案 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