比较matlab中逻辑矩阵的行?

时间:2015-04-02 16:21:48

标签: matlab matrix

我有句子交叉词[4 cross 5]矩阵如下:

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 1中都有row 2,此信息应存储在1D单元格数组中。

假设以上示例,它的输出将为:

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

其中{1,1}根据sentence 1字词告诉sentence 1value=1的关系,{1,2}告诉sentence 1sentence 2的关系} value=1基于{{1}}等等...

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
[...]