使左右对角线以下的矩阵值设置为0

时间:2014-10-28 04:11:57

标签: java arrays matrix

我必须使用这个程序才能使这个方法返回一个二维矩阵,其中:

  • 左右对角线上方和上方的值与存储在matrixA中的值相同。
  • 左右对角线以下的值设置为0并假设matrixA的行数等于matrixA的列数。

我必须使用此标头:public static int[][] replaceLowerWithZero(int[][] matrixA)

这是我得到的线索:定义一个具有相同行数的二维数组 和列为matrixA。此数组中的每个元素最初都设置为零。使用 嵌套循环,用于更改左右对角线上方的值。

这是我到目前为止所做的:

public static int[][] getTranspose(int[][] matrixA) {
    int numRows = matrixA.length;
    int numCols = matrixA[0].length;
    int[][] transpose = new int[numCols][numRows];
    for (numRows = 0; numRows < matrixA.length; numRows++) {
        for (numCols = 0; numCols < matrixA[numRows].length; numCols++) {
            tranpose[numCols][numRows]=0;
        }
    }
    return transpose;
}

public static int getLRDiagonalSum(int[][] B) {
    int sum = 0;
    for (int rows = 0; rows < B.length; rows++) {
        sum = sum + B[rows][rows];
    }
    return sum;
}
public static int getRLDiagonalSum(int[][] B) {
    int sum = 0;
    for (int cols = 0; cols < B.length; cols++) {
        sum = sum + B[cols][cols];
    }
    return sum;
public static int[][] replaceLowerWithZero(int[][] matrixA){

1 个答案:

答案 0 :(得分:0)

该方法与您的getTranspose方法非常相似。但是,索引将略有不同。根据您的评论,我们假设矩阵是逐列存储的(即matrixA[i]i th 列。如果事实证明这是向后的(并且它似乎是从方法getTranspose中的变量名称判断),那么你将不得不修改逻辑,但是应该很容易弄清楚如何做它

由于这是一项任务,我不想只是将代码转储到答案中;相反,我将概述如何通过提供一些代码和评论来解决问题。

首先,我们将从分配的方法签名开始:

public static int[][] replaceLowerWithZero(int[][] matrixA) {

接下来,我们检索矩阵大小。因为根据赋值我们可以假设一个方阵,我们所需要的只是一个维度。我们称之为n

    int n = matrixA.length;

现在我们分配一个新的矩阵作为返回值:

    int[][] result = new int[n][n];

根据Java语言,result的所有元素都将初始化为零。由于这是您想要的结果的下三角部分,我们只需要将matrixA的值复制到result,以获取对角线上方和上方的元素。我们可以一次处理每一栏:

    for (int colIndex = 0; colIndex < n; colIndex++) {
        int[] column = result[colIndex]; // all elements zero at this point

逻辑其余部分的关键是可视化column数组与整个矩阵的关系:它是一列切片。因此,严格低于column对角线的result元素是位于colIndex之上的索引的元素。也就是说,元素column[0]位于列colIndex,第0行和元素column[colIndex]位于对角线的位置(colIndexcolIndex)。只有对角线上方和上方的元素应设置为非零值。这可以通过另一个循环轻松完成:

        for (rowIndex = 0; rowIndex <= colIndex; rowIndex++) {
            // copy the element at position (colIndex, rowIndex) from
            // matrixA to column[rowIndex]

我会留给你把那个伪代码转换成实际的代码,并完成方法(包括返回结果)。

如果您愿意(并且分配规则允许),您可以通过调用内置static方法System.arraycopy替换该内部循环,该方法可以复制全部或部分数组另一个数组(或同一个数组的另一部分)。在这个特定情况下,为这个调用找出正确的参数留给读者一个练习。 :)