2015-04-02 150 views
1

我有句交叉字[4横5]矩阵如下:比较matlab中逻辑矩阵的行?

out= 

0 1 1 0 1 
1 1 1 0 0 
0 0 1 1 0 
1 1 0 1 1 

我想创建基于上述矩阵一维单元阵列,其应该告诉其中两个句子相同词出现与value = 1即让我们line 1line 2其中在2点column 2column 3逻辑矩阵有1'srow 1row 2这个信息应该存储在1D单元阵列中。

假设上面的例子它的输出将如下:

output{1,1} = [] 
output{1,2} = [2 3] 
output{1,3} = [3] 
..... 
output{n,n} = [....] 

其中{1,1}讲述与sentence 1的话value=1基础上sentence 1关系,{1,2}讲述与sentence 2sentence 1关系的词语的value=1等的基础上在...

+0

为什么'输出{1,3} = [1]'?它不应该是'[3]'吗? – 2015-04-02 16:27:05

+0

@LuisMendo对不起,这是我的坏,我犯了一个错误 - 感谢指出。更正问题 – 2015-04-02 16:30:53

+1

而不应该'输出{1,1}'是'[2 3 5]'? – 2015-04-02 16:32:55

回答

4

试试这个:

x = [ 0 1 1 0 1 
     1 1 1 0 0 
     0 0 1 1 0 
     1 1 0 1 1]; 
[ii, jj] = ndgrid(1:size(x,1)); 
y = arrayfun(@(m,n) find(x(m,:) & x(n,:)), ii, jj, 'uniformoutput', 0); 

结果:

y{1,1} = 
    2  3  5 
y{2,1} = 
    2  3 
y{3,1} = 
    3 
y{4,1} = 
    2  5 
[...] 

如果你想对角元素为空:

y = arrayfun(@(m,n) find(x(m,:) & x(n,:) & m~=n), ii, jj, 'uniformoutput', 0) 

结果:

y{1,1} = 
    [] 
y{2,1} = 
    2  3 
y{3,1} = 
    3 
y{4,1} = 
    2  5 
[...] 
4

如果你想要写东西写得很快......而且由于我们正在处理单元阵列,最简单的事情就是制作一对for循环。假设你已经在out定义了你的矩阵:

out_cell = cell(size(out,1),size(out,1)); 
for idx = 1 : size(out,1) 
    for idx2 = 1 : idx 
     vals = find(out(idx,:) & out(idx2,:)); 
     out_cell{idx,idx2} = vals; 
     out_cell{idx2,idx} = vals; 
    end 
end 

对于每一对行,idxidx2,我们看看,看看是否有列在具有1项匹配,然后将指标到各个小区在2D单元阵列中的位置。请注意,因为会遇到重复行对(即检查第3行和第5行,与第5行和第3行比较),因此不需要第二个for循环遍历其他所有行。我们只需要检查由外部循环描述的当前行,并且我们只是使用交换的行索引编写相同的值...所以这是一个“对称”矩阵。

如果您希望对角线元素为空,只需更改内部for循环,使其变为for idx2 = 1 : idx-1而不是for idx2 = 1 : idx

你的榜样,我们得到:

>> out_cell 

out_cell = 

    [1x3 double] [1x2 double] [   3] [1x2 double] 
    [1x2 double] [1x3 double] [   3] [1x2 double] 
    [   3] [   3] [1x2 double] [   4] 
    [1x2 double] [1x2 double] [   4] [1x4 double] 

>> celldisp(out_cell) 

out_cell{1,1} = 

    2  3  5 



out_cell{2,1} = 

    2  3 



out_cell{3,1} = 

    3 



out_cell{4,1} = 

    2  5 



out_cell{1,2} = 

    2  3 



out_cell{2,2} = 

    1  2  3 



out_cell{3,2} = 

    3 



out_cell{4,2} = 

    1  2 



out_cell{1,3} = 

    3 



out_cell{2,3} = 

    3 



out_cell{3,3} = 

    3  4 



out_cell{4,3} = 

    4 



out_cell{1,4} = 

    2  5 



out_cell{2,4} = 

    1  2 



out_cell{3,4} = 

    4 



out_cell{4,4} = 

    1  2  4  5 
+2

利用您使用循环的事实,您可以避免计算每对两次:'对于idx2 = 1:idx'(或'对于idx2 = 1:idx-1'),并且在内部循环内填充'out_cell {idx2, idx}'以及 – 2015-04-02 16:36:39

+0

@LuisMendo - 哦,是的!好主意! – rayryeng 2015-04-02 16:37:39

+2

另外,我认为OP只需要一个。所以'=='变成'&' – 2015-04-02 16:37:45