如何检查矩阵是否是反对称的

时间:2018-11-07 22:25:47

标签: java matrix multidimensional-array

这是我的代码,用于检查矩阵是否是反对称的。 (当且仅当A中的任何a和b在R中的(a,b)和R中的(b,a)中,a = b必须成立时,集合A上的关系R称为反对称)。 / p>

// AntiSymmetric
public static boolean checkAntisymmetric(Graph graph, int vertices){
    boolean antisymmetric = false;
    for(int i = 1; i <= vertices; i++) {
        for(int j = 1; j <= vertices; j++){
            if((graph.getEdge(i, j) == graph.getEdge(j, i)) && (i == j)){
                antisymmetric = true;
                break;
            }
        }
    }
    if(antisymmetric){
        return true;
    }
    else {
        return false;
    }
}

我的getEdge函数是:

public int getEdge(int to, int from){
    try{
        return adjencencyMatrix[to][from];
    } catch(ArrayIndexOutOfBoundsException index){
        System.out.println("Vertices does not exist");
    }
    return -1;
}

例如,如果我给出以对表示的边:(2,3)(3,5)(3,2)(5,1)(4,4) 由于(4,4),应返回false。 另外,我以此为参考:Representing Relations

我能够创建一个函数,用于检查矩阵是否确实对称。唯一不同的是,我的反对称函数在if语句中具有条件(i == j)。有人可以看到为什么它总是返回true吗?谢谢。 下面显示了我用来测试该功能的示例矩阵:

0 0 0 0 0
0 0 1 0 0
0 1 0 0 1
0 0 0 0 0
1 0 0 0 0

对于配对:(2,3)(3,5)(3,2)(5,1)

1 个答案:

答案 0 :(得分:1)

不对称意味着对于每个i,j,其中i!= j,M(i,j)== 0或M(j,i)== 0。

您当前的状况:

if((graph.getEdge(i, j) == graph.getEdge(j, i)) && (i == j))

由于i == j的状态,您正在检查矩阵中心下方的对角线。这意味着自getEdge(i, j) == getEdge(i, i) == getEdge(j, j) == getEdge(j, i)i == j。因此,由于您正在将矩阵条目与其自身进行比较,因此您的检查将始终通过。

尝试实现您提供的定义中指定的条件,该条件基本上指出两个之一必须为0

if((graph.getEdge(i, j) == 0 || graph.getEdge(j, i) == 0) && (i != j))

但是,打破循环的逻辑也存在缺陷,因为如果第一对满足该条件而不是整个矩阵,则返回true。尝试检查是否有故障,并尽早退出,否则,如果您通过矩阵而没有失败,那么您将知道每对配对的条件都是成功的,并且矩阵是不对称的:

// AntiSymmetric
public static boolean checkAntisymmetric(Graph graph, int vertices){
    for(int i = 1; i <= vertices; i++) {
        for(int j = 1; j <= vertices; j++){
            if((i != j) && graph.getEdge(i, j) != 0 && graph.getEdge(j, i) != 0) {
                return false;
            }
        }
    }
    return true;
}

我们实质上要检查是否有不满足条件的配对。