我正在使用此代码从以下矩阵中找到邻接矩阵: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
有人可以帮帮我。谢谢你。
答案 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