0

我正在编写此代码以从以下矩阵 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

有人可以帮我吗。在此先感谢。

4

2 回答 2

0

这段代码更紧凑一些。它用于ndgrid生成行的所有组合,并ismember测试行之间的邻接性。[](empty matrix) 需要转换为''(empty string)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
于 2014-02-01T15:38:58.733 回答
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一个循环,而不是针对自己测试元素(邻接矩阵对角线为零)...

于 2014-02-01T05:16:20.067 回答