【问题标题】:How to check if matrix is symmetric?如何检查矩阵是否对称?
【发布时间】:2019-04-15 17:49:42
【问题描述】:

我必须将矩阵垂直分成两半并查看它是否对称。例如,如果 mat[0][0]==mat[0][1] 和 mat[1][0]==mat[1][1],则矩阵是对称的。我已经设法检查了 2x2 矩阵的对称性,但我希望该函数适用于任何类型的矩阵,例如 4x4 或 3x3。

i 和 j 是我用来遍历 mat 元素的变量,n 是矩阵的维数。这是 2x2 矩阵的函数。如何概括它?

 private static void getSymmetry(int mat[][], int i, int j, int n) {
        int index = 0;
        int sum=0;
        if (n == 2) {
            if (mat[i][j] == mat[i][j + 1]) {
                index = index + 1;
            }
            if (mat[i + 1][j] == mat[i + 1][j + 1]) {
                index = index + 1;
            }
            sum = sum + index;
        }
        System.out.println("Degree of symmetry is " + sum);
    }

【问题讨论】:

  • 关于哪个轴对称?
  • 我在 oY 轴(垂直)上分割矩阵并检查右侧的元素是否与左侧的元素对称@Andy Turner
  • 一般情况下不宜分开处理。每个矩阵的算法都是相同的。使用 for 循环遍历所有行并检查该行是否对称。为此,您必须遍历行的元素并检查是否为row[x] == row[len-1-x]。有了它,您应该能够自己编写代码。堆栈溢出不是代码工厂
  • 奇数列的矩阵是什么?
  • 您确定您的问题正确吗?通常对称矩阵意味着对角线对称而不是 y 轴 - 请参阅:en.wikipedia.org/wiki/Symmetric_matrix。但是,如果您的意思是跨 y 轴镜像 - 您需要定义如何管理奇数列 - 例如在 3x3 中 - 我们是否忽略中间列?

标签: java arrays matrix


【解决方案1】:

您可以使用以下方法检查所有数字的对称性:

private static boolean isSymmetric(int mat[][]) {
    for(int a = 0; a< mat.length; a++){
        for(int b = 0; b < mat[a].length / 2; b++){
            if(mat[a][b] != mat[a][mat[a].length-b-1]) {
                return false;
            }
        }
    }       
    return true;
}

...

boolean symmetric = isSymmetric(mat);
if(symmetric) {
    System.out.println("symmetric");
} else {
    System.out.println("Not symmetric");
}

【讨论】:

  • 一旦发现不同之处,就应该打破双循环!
  • @snr 如果您是“mühendis”,则必须知道尚未初始化的数组不能作为方法的参数。还有一点,一个已经初始化但没有任何特定数据的数组包含所有的 0。所以它永远不能为 null 或为空。
【解决方案2】:

虽然提供的答案很好,但这里是使用称为Two-Pointers 的已知技术的另一种尝试。我相信虽然它更加清晰和优化。

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        // your code goes here
        int[][] mat = {
            {1, 2, 2, 1},
            {4, 3, 3, 4},
            {2, 3, 3, 2}
        };

        //assume the matrix is square
        int rows = mat.length, columns = mat[0].length;

        boolean symmetric = true;
        for(int r = 0; r < rows && symmetric; r++){
            //now declare two pointers one from left and one from right
            int left = 0, right = columns - 1;

            while (left < right){
                if(mat[r][left] != mat[r][right]){
                    symmetric = false;
                    break;
                }
                right--;
                left++;
            }
        }

        System.out.println(symmetric? "The matrix is symmetric." : "The matrix isn't symmetric.");
    }
}

这是Ideone 代码。

【讨论】:

  • 你也应该打破你的第二个循环!
  • @Deian 再看看for循环中的条件,你会看到的
  • 我看到你的 && 对称但那是一个额外的“如果”。我会在函数 isSymmetric() 中有该代码,当我们检测到差异时退出 - 它会更快;)
【解决方案3】:
public class MatrixSymmetry {

  public static void main(String[] args) {

    int[][] matrix = {
        {1, 1, 1},
        {1, 2, 1},
        {1, 1, 1}
    };

    System.out.println(isSymmetric(matrix));
  }

  public static boolean isSymmetric(int[][] matrix) {

    for (int i = 0; i < matrix.length; i++) {

      // you got the row
      int[] row = matrix[i];
      int end = row.length - 1;

      for (int start = 0; start < end; start++) {
        if (row[start] != row[end]) {
          return false;
        }
        end--;
      }

    }
    return true;
  }

}

【讨论】:

  • @Deian 你的说法不正确。 start&lt;=end 将使它验证中间列,因为它将使条件为真。 start &lt; end 是你要找的,我已经添加了。
【解决方案4】:

这是检查对称矩阵的一种不太复杂且有效的方法。只要矩阵中存在不相等的维度或匹配,它就会中断循环,然后返回 false,否则如果没有不匹配则返回 true。

public boolean isMatrixSymmetric(int [][] matrix){
        for (int x = 0; x < matrix.length; x++) {
            if(matrix.length != matrix[x].length){
                return false;
            }
            for (int y = 0; y < matrix[x].length; y++) {
                if(matrix[y][x] != matrix[x][y]){
                    return false;
                } 
            }
        }
        return true;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-12
    • 2021-03-17
    • 1970-01-01
    • 2015-09-19
    • 2019-03-09
    • 2022-01-15
    • 1970-01-01
    • 2017-10-08
    相关资源
    最近更新 更多