2015-05-24 3 views
1

У меня есть матрица A(na*7) и матрица B(nb*7). (например, A(16*7) и матрица B(110*7)) A и B оба имеют 1 и 0 в качестве контекста.Матричные операции без петли MATLAB

Я хочу выполнить операцию xor между каждой строкой A и каждой строкой B и подсчитать количество 1 в результате и сохранить ее в другой матрице C размером na*nb.

Я знаю, как это сделать для циклов, но мне интересно, есть ли какой-нибудь элегантный способ сделать это без циклов, чтобы сэкономить скорость.

Например

Если размер A является 3*2 и размер B является 4*2 я хочу, чтобы выполнить эти операции:

sum(xor(A(1,:),B(1,:))) 

sum(xor(A(2,:),B(1,:))) 

sum(xor(A(3,:),B(1,:))) 

l--------------l 

sum(xor(A(1,:),B(2,:))) 

sum(xor(A(2,:),B(2,:))) 

sum(xor(A(3,:),B(2,:))) 

l--------------l 

sum(xor(A(1,:),B(3,:))) 

sum(xor(A(2,:),B(3,:))) 

sum(xor(A(3,:),B(3,:))) 

l--------------l 


sum(xor(A(1,:),B(4,:))) 

sum(xor(A(2,:),B(4,:))) 

sum(xor(A(3,:),B(4,:))) 

Тогда я хочу каждый результат будет храниться в каждом C. набор из 3 результатов - один ряд из C

Большое спасибо

ответ

1

Вы можете сделать это с bsxfun и permute:

C = sum(bsxfun(@xor, permute(A, [1 3 2]), permute(B, [3 1 2])), 3) 
+0

вы можете написать команду таким образом, чтобы она параметризовано пожалуйста? –

+1

Нет необходимости, параметры фиксированы. Вам ничего не нужно менять. Учитывая две логические матрицы (A и B), она создаст матрицу C так, как вы указали в вопросе. –

+0

Yeap кажется, что он работает .. Большое спасибо. могу ли я спросить, каков параметр [1 3 2] после A и [3 1 2] после B? –

0

Вы можете сделать это с помощью pdist2 с 'hamming' вариант:

C = pdist2(A,B,'hamming')*size(A,2); 
+0

Большое спасибо, он тоже работает! –

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