如何避免在matlab中重复一些矩阵元素

时间:2014-09-15 20:40:20

标签: matlab

我有 CH =     7 12 31 44 47 49 55 60 75 90 &安培; N是1和0的矩阵

我想在CH(ex:7)中取一个元素然后应用N(7,CH),这意味着除了7之外的CH的所有元素,然后我想移动到第二个元素12检查N(12) ,CH),CH这里我想要CH的所有元素,除了12& 7。 然后如果N == 1我想要将数字保存在矩阵中。 这是我尝试过的代码,但问题是它产生了矩阵" one_hop_heads"重复一些结果ex: one_hop_heads = [7 12; 44 49; 12 7]我不想要这样的事情 任何人都可以帮助我吗?

for i=1:length(CH)
          for j=1:length(CH)
              if i~=j
                 if N(CH(i),CH(j))==1
                    one_hop_heads= [one_hop_heads; CH(i),CH(j)];
                 end 
              end 
          end 
    end

1 个答案:

答案 0 :(得分:1)

看看这是否是您正在寻找的:

for ii=1:length(CH)
    for jj=ii+1:length(CH)
        if N(CH(ii),CH(jj))==1
            one_hop_heads= [one_hop_heads; CH(ii),CH(jj)];
        end 
    end 
end

(请注意,我已将变量ij更改为iijj,以避免与内置虚数冲突。)< / p>

这是做什么的:
jj上的每个循环都从ii+1开始。这可确保ii始终严格小于jj(删除一个if语句)。通过以这种方式使用有序对,您可以确保如果查看一对(ii, jj),则永远不会查看对(jj, ii)

我相信你也可以使用find在没有循环的情况下做到这一点,类似于Jigg的回答:

N2 = triu(N(CH,CH),1);
[ii,jj] = find(N2);
one_hop_heads = [CH(ii),CH(jj)];

注意:这两种解决方案都假设N是对称的。如果不是这种情况,您必须澄清N的结构是什么,我可以调整解决方案。