6

Имеет ли Matlab логическую (иногда называемую логической или двоичной) функцию умножения матрицы? Я специально говорю о том, что, как правило, обозначается кружком с точкой в ​​нем, чтобы обозначить логическое умножение матриц:Булева умножение матрицы в Matlab

cij = (ai1 & b1j) || (ai2 & b2j) || (ai3 & b3j)|| ... || (aik & bkj) 

У меня было трудное время обнаружить местонахождение один и теперь предполагая один не существует. Если это так, есть ли быстрый способ написать файл .m, который выполнит эту задачу?

Примером может быть:

[1 1 1;    [1 0 1;  [1 1 1 
1 0 1; *circledot* 1 0 0; = 1 1 1 
1 0 0]     0 1 0]  1 0 1] 

ответ

7

Вы можете просто позволить MATLAB для выполнения стандартного матричного умножения и преобразования результата в logical:

b1 = [1,1,1;1,0,1;1,0,0] 
b2 = [1,0,1;1,0,0;0,1,0] 
bout = (b1*b2)>0 % or logical(b1*b2) as per natan's answer! 

bout = 

    1  1  1 
    1  1  1 
    1  0  1 

Однако, если вы хотите, чтобы добросовестно выполнять логические операции AND-OR оператора умножения булевой матрицы, вы можете сделать это с помощью bsxfun и any следующим образом:

bout = any(bsxfun(@and,permute(b2,[3 2 1]),permute(b1,[1 3 2])),3); 

Это довольно хорошо запутывает процесс, но оно следует формуле.

Данные экспресс-теста: b1 = randi(2,M,N)-1; b2 = randi(2,N,M)-1;.

+0

Да, пропустил это. Благодарю. –

3

Матричное умножение представляет собой последовательность операций умножения и добавления. Если входы все равно и нули, результат такой операции будет «ноль или больше нуля». Поэтому установка каждого значения> 0 на 1 в продукте решит вашу проблему. Пример:

booleanResult = (результат> 0);

Или

booleanResult = логический (результат);

Уверен, вы можете думать о других.

+1

Очень хорошая точка. Если бы я понял, что для начала я бы не задал вопрос. Умные люди здесь, высоко оценили. –

+0

Это самый быстрый способ выполнить вычисление: простое матричное умножение над двумя бинарными матрицами. Это намного быстрее, чем bsxfun на порядки. – gaborous

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