Storing lower triangle of a matrix into an array

Tags: java

I want to store the lower triangle of a matrix into a single dimension array.

int matrixSample [][]  = {{6,4,1},{7,5,9},{3,2,8}};

6 4 1
7 5 9
3 2 8

When I print the lower triangle it is fine as it has the respected output.

for(int i = 0; i < matrixSample.length; i++){
for(int j = 0; j < matrixSample.length; j++){
if(i>=j) {
System.out.print(matrixSample[i][j] + " ");
}
}
System.out.println("");
}

6
7 5
3 2 8

The trouble I am having is with the index position when I try to add the diagonals to a separate array. The right values are collected but in the wrong order. My if() is allowing matrix to be stored before matrix.

static int[] getAllDiagonalsInMatrix(int matrix[][]){
int diagonal[] = new int[matrix.length * (matrix.length - 1)];
int index = 0;

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

for(int col = 0; col < matrix[row].length; col++) {
if(row >= col) {
diagonal[index] = matrix[row][col];
index++;
}
}
}
return diagonal;
}

[6, 7, 5, 3, 2, 8]

The result I am looking for is

[6,5,8,7,2,3]

1. The number of elements in the resulting array is n * (n + 1) / 2 as it is a sum of arithmetic progression from 1 to n
2. When creating the result array, the indexes change like this:
0,0; 1,1; 2,2... n,n
1,0; 2,1; n,n-1
...
n,0

So the inner loop should be rewritten as shown below:

static int[] getLowerDiagonals(int[][] matrix) {
int n = matrix.length;
int m = n * (n + 1) / 2;
int[] res = new int[m];
int k = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i; j++) {
res[k++] = matrix[j + i][j];
}
}
return res;
}

Test:

int matrixSample [][]  = {{6,4,1},{7,5,9},{3,2,8}};

for (int[] r : matrixSample) {
System.out.println(Arrays.toString(r));
}

System.out.println("Diagonals: " + Arrays.toString(getLowerDiagonals(matrixSample)));

Output:

[6, 4, 1]
[7, 5, 9]
[3, 2, 8]
Diagonals: [6, 5, 8, 7, 2, 3]

For matrix 4×4, the output is as follows:

int matrixSample [][]  = {{6,4,1,2},{7,5,9,3},{3,2,8,6},{3,1,2,4}};

Output:

[6, 4, 1, 2]
[7, 5, 9, 3]
[3, 2, 8, 6]
[3, 1, 2, 4]
Diagonals: [6, 5, 8, 4, 7, 2, 2, 3, 1, 3]

Source: stackoverflow