如何在matlab中形成邻接矩阵

时间:2014-02-01 04:33:05

标签: arrays matlab character character-arrays

我正在使用此代码从以下矩阵中找到邻接矩阵:mapr:

   'mad'     []       []      []

   'sister'  []       []      []

   'dog'     'inter'  'mad'   'said'

对于上面的矩阵,根据我编写的代码,这是我得到的输出,这不是所需的:

       0   1   1
       1   0   1
       1   1   0

以下是我的代码:

for i=1:no_of_rows
   for j=1:no_of_cols
      for m=i+1:no_of_rows
          for k=1:no_of_cols
             if(~isempty(mapr(i,j)))
               if(strcmp(mapr(i,j),mapr(m,k))==0)
                   Adjmatr(i,m)=1;
                   Adjmatr(m,i)=1;
                end
              end
          end
      end
    end
end

有人可以帮帮我。谢谢你。

2 个答案:

答案 0 :(得分:0)

我认为您正在寻找以下内容:

mapr={   'mad',      [],    [],     [];
      'sister',      [],    [],     [];
         'dog', 'inter', 'mad', 'said'};

s1 = size(mapr,1);
s2 = size(mapr,2);
result = zeros(s1, s1);
for i = 1 : s1
  for j = 1 : s2 - 1
    if ~isempty(mapr{i,j})
        for k = i+1:s1
            for l = j+1:s2
                 if strcmp(mapr{i,j}, mapr{k,l})
                    result(i,k) = 1;
                    result(k,i) = 1;
                 end
            end
        end
     end
  end
end

结果矩阵

0 0 1
0 0 0
1 0 0

我认为关键是要将~isempty再移出一个循环,而不是自己测试元素(邻接矩阵对角线为零)......

答案 1 :(得分:0)

这段代码更紧凑。它使用ndgrid生成所有行组合,并使用ismember来测试行之间的相关性。需要将[](空矩阵)转换为''(空字符串),以便可以应用ismember。明确地处理空字符串,以便它们不计入邻接。

mapr = {'mad'    []       []      []
       'sister'  []       []      []
       'dog'     'inter'  'mad'   'said'}; %// example data

N = size(mapr,1);
mapr = cellfun(@(x) num2str(x), mapr, 'uni', 0); %// convert [] to ''
[ii,jj] = ndgrid(1:N); %// generate all combinations of rows
adjMatr = NaN(N,N); %// pre-shape result matrix
adjMatr(:) = arrayfun( @(n) ...
  any(ismember(mapr(ii(n),:), mapr(jj(n),:)) & ... %// check adjancency
  ~cellfun('isempty', mapr(ii(n),:))), 1:numel(ii) ); %// rule out empty strings 
adjMatr = adjMatr - eye(N); %// remove self-coincidences