【问题标题】:comparing rows of a logical matrix in matlab?在matlab中比较逻辑矩阵的行?
【发布时间】:2015-04-03 00:51:59
【问题描述】:

我有句子cross words[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 1 和 line 2 其中两个点 column 2 和 @987654326 @ 逻辑矩阵在row 1 和row 2 中都有1's,此信息应存储在一维元胞数组中。

假设上面的例子它的输出是:

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

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

【问题讨论】:

  • 为什么是output{1,3} = [1]?不应该是[3]吗?
  • @LuisMendo 抱歉,这是我的错,我做错了 - 感谢您指出。问题已更正
  • 不应该output{1,1} 是[2 3 5]?
  • @LuisMendo 是的,你是仪式实际上我对它的自我关系不感兴趣,这就是为什么忽略它,但也感谢你指出这一点。

标签: matlab matrix


【解决方案1】:

试试这个:

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
[...]

【讨论】:

    【解决方案2】:

    如果您想快速编写一些东西......并且由于我们正在处理元胞数组,最简单的方法是拥有一对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
    

    对于每一对行,idx 和 idx2,我们查看是否有任何列匹配为 1,然后将索引放入二维元胞数组中的相应元胞位置。请注意,因为会遇到重复的行对(即检查第 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
    

    【讨论】:

    • 利用你使用循环的事实,你可以避免计算每一对两次:for idx2 = 1 : idx(或for idx2 = 1 : idx-1),并在内部循环中填充out_cell{idx2,idx}
    • @LuisMendo - 哦,是的!好主意!
    • 另外,我认为 OP 只想要那些。所以==变成&
    • @LuisMendo - 也正确。固定的。我忘了这将是一个“对称”矩阵。
    • @rayryeng 非常感谢您的详细回答和分步说明,它工作得非常好。
    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 2016-03-28
    相关资源
    最近更新 更多