2015-04-27 15 views
0

У меня есть [предложения * слова] матрица, как показано нижеКак сравнить столбцы двоичной матрицы и сравнить элементы в matlab?

out = 0 1 1 0 1 
     1 1 0 0 1 
     1 0 1 1 0 
     0 0 0 1 0 

я хочу, чтобы обработать эту матрицу таким образом, что должен сказать W1 & W2 в «предложении № 2» и «предложения № 4» происходит с таким же значение т.е. 1 1 и 0 0 .the выход должен быть следующим:

output{1,2}= 2 4 

выход {1,2} указывает слово номер 1 и 2 происходит в предложении номер 2 и 4 с одинаковыми значениями.

после сравнения W1 & W2 следующего кандидата должна быть W1 & W3, которое происходит с тем же значением в sentence 3 & sentence 4

output{1,3}= 3 4 

и так далее до каждого nth слова по сравнению со всеми другими словами и сохранены.

ответ

1

Вы можете получить логическую матрицу размера # слов в каждом конкретном количество слов в каждом конкретном # предложения легко с помощью :

coc = bsxfun(@eq, permute(out, [3 2 1]), permute(out, [2 3 1])); 

этот логический массив occ(wi, wj, si) истинно тогда и только тогда слово wi и слово wj происходит в предложение si с тем же значением.

Чтобы получить массив в output клеток от coc вам нужно

nw = size(out, 2); %// number of words 
output = cell(nw,nw); 
for wi = 1:(nw-1) 
    for wj = (wi+1):nw 
     output{wi,wj} = find(coc(wi,wj,:)); 
     output{wj,wi} = output{wi,wj}; %// you can force it to be symmetric if you want 
    end 
end 
+0

спасибо за ваш ответ, я хотел бы спросить, что делает '[3 2 1 ] 'делать в функции' bsxfun', во-вторых, я хочу применить эту операцию в [N * M] матрице, где предложения и слова логической матрицы различаются по размеру в разных случаях. могу ли я запустить этот код для любых измерений матрицы предложений? –

+1

@AfzaalAhmad (1) '[3 2 1]' аргумент не из 'bsxfun' напрямую, а для' permute', пожалуйста, прочитайте документацию 'permute', чтобы лучше понять решение. Этот ответ должен работать над любой двумерной матрицей 'out'. – Shai

+0

ОК, и что, если я хочу отображать 'output' в одной строке, а не в формате столбца в отдельных строках, я пробовал' celldisp (output) ', но он дает вывод, состоящий из нескольких строк, которые мне нужно отображать следующим образом 'например' 'output {1,2} = 1 3 4, ...' –

2

Это будет один vectorized подход -

%// Get number of columns in input array for later usage 
N = size(out,2); 

%// Get indices for pairwise combinations between columns of input array 
[idx2,idx1] = find(bsxfun(@gt,[1:N]',[1:N])); %//' 

%// Get indices for matches between out1 and out2. The row indices would 
%// represent the occurance values for the final output and columns for the 
%// indices of the final output. 
[R,C] = find(out(:,idx1) == out(:,idx2)) 

%// Form cells off each unique C (these will be final output values) 
output_vals = accumarray(C(:),R(:),[],@(x) {x}) 

%// Setup output cell array 
output = cell(N,N) 

%// Indices for places in output cell array where occurance values are to be put 
all_idx = sub2ind(size(output),idx1,idx2) 

%// Finally store the output values at appropriate indices 
output(all_idx(1:max(C))) = output_vals 
Смежные вопросы