【问题标题】:Boolean Matrix Multiplication in MatlabMatlab中的布尔矩阵乘法
【发布时间】:2013-11-29 15:45:49
【问题描述】:

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]

【问题讨论】:

    标签: matlab matrix boolean matrix-multiplication boolean-operations


    【解决方案1】:

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

    不过,如果您想忠实地执行布尔矩阵乘法运算符的逻辑与或运算,您可以使用bsxfunany 进行如下操作:

    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;

    【讨论】:

    • 是的,错过了。谢谢。
    【解决方案2】:

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

    booleanResult = (结果 > 0);

    或者

    booleanResult = 逻辑(结果);

    我相信你能想到其他人。

    【讨论】:

    • 非常好。如果我意识到一开始我就不会问这个问题。这里的聪明人,非常感谢。
    • 这实际上是执行计算的最快方法:对两个二进制矩阵进行简单的矩阵乘法。这比 bsxfun 快了几个数量级。
    猜你喜欢
    • 1970-01-01
    • 2015-06-17
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    相关资源
    最近更新 更多