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

Я хочу создать массив 1D клеток, основанный на упомянутой матрицы, которая должна сказать, в которой два предложения же слова появляются с value = 1 то давайте line 1 и line 2, в которых в 2 точках column 2 и column 3 логическая матрица имеет как 1's в row 1, так и row 2, эта информация должна храниться в массиве 1D ячеек.

предположит выше примере это результат будет как:

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

где {1,1} говорит sentence 1 связи с sentence 1 на основе value=1 слов, {1,2} говорит sentence 1 связи с sentence 2 на основе value=1 слов и так на ...

+0

Почему 'Выход {1,3} = [1]'? Разве это не должно быть '[3]'? –

+0

@ LuisMendo извините, это мое плохое, я сделал ошибку - спасибо, что указали это. вопрос исправлен –

+1

И не должен выводить {1,1} 'be' [2 3 5] '? –

ответ

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 

Для каждой пары строк, 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 
+2

Используя тот факт, что вы используете циклы, вы можете избежать вычисления каждой пары дважды: 'для idx2 = 1: idx' (или' для idx2 = 1: idx-1') и внутри внутреннего цикла заполнить 'out_cell {idx2, idx} 'также –

+0

@ LuisMendo - О да! Хорошая идея! – rayryeng

+2

Кроме того, я думаю, что OP только хочет. Поэтому '==' становится '&' –

Смежные вопросы