在Matlab中进行布尔矩阵乘法

7
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]
2个回答

8

您可以只允许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;


是的,我漏掉了。谢谢。 - Pencil Von Radiergummi

3

矩阵乘法是一系列的乘和加操作。如果输入都是1和0,这种操作的结果将是“零或大于零”。因此,在乘积中将每个值>0设置为1将解决您的问题。例如:

booleanResult = (result > 0);

或者

booleanResult = logical(result);

我相信你还能想到其他方法。


1
非常好的观点。如果我一开始就意识到这一点,我就不会问这个问题了。这里有很聪明的人,非常感谢。 - Pencil Von Radiergummi
事实上,执行计算的最快方法是在两个二进制矩阵之间进行简单的矩阵乘法运算。这比bsxfun快得多。 - gaborous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接