2015-04-02 251 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