2017-05-31 112 views
0

我需要编写一个转换矩阵的代码,我不能这样做,程序只替换几个位置,其他位置保持在同一位置。任何想法这个问题?Java:转置矩阵 - 分而治之

我需要任何矩阵工作为n×n

public static int [][] getTransposed(int matrix[][], int initRow, int endRow, int initColumn, int endColumn, int totalSize) { 

    if (endRow - initRow <= 2 && endColumn - initColumn <= 2) { 
     return invertPosition(matrix, initRow, endRow, initColumn, endColumn); 
    } else { 
     int mediumRow = (initRow + endRow)/2; 
     int mediumColumn = (initColumn + endColumn)/2; 

     getTransposed(matrix, initRow, mediumRow, initColumn, mediumColumn, totalSize); 
     getTransposed(matrix, initRow, mediumRow, mediumColumn, endColumn, totalSize); 
    } 

    return matrix; 
} 

private static int [][] invertPosition(int matrix[][], int initRow, int endRow, int initColumn, int endColumn) { 
    int temp; 
    for (int r = initRow; r < endRow; r++) { 
     for (int c = initColumn; c < endColumn; c++) { 
       temp = matrix[r][c]; 
       matrix[r][c] = matrix[c][r]; 
       matrix[c][r] = temp; 
     } 
    } 
    return matrix; 
} 
+1

这代码看上去比它应该完成这个任务变得更加困难。至于这个问题,你从'getTransposed'函数返回值,但是当你递归地调用它时,你不会把这个值赋给任何东西。 – Shadov

+0

匆匆一瞥,我错过了两个递归调用,涉及'getTransposed(matrix,modiumRow,endRow,...)'(一个用于两个列范围)。一些简单的'System.out.println(/ *所有行/列信息* /)''语句可能会让你自己弄清楚。如果不是,通常会赞赏[MCVE]。 – Marco13

回答

0

我会建议通过的援用来创建一个方法来查找移调给定n×n个矩阵的Java可用的类如ArrayList。我会做这样的事情:

import java.util.ArrayList; 
import java.util.List; 

public class MatrixTranspose{ 

    public static void main(String[] args) { 

     int[][] matrix = {{1,2,3},{4,5,6},{7,8,9}}; // 3x3 square matrix 
     int[][] matrix1 = {{1,2}}; // one row 
     int[][] matrix2 = {{1},{4},{7}}; // one column 
     int[][] matrix3 = {{1,2,3},{4,5,6}}; // 2x3 matrix 
     int[][] matrix4 = {{1,2},{3,4},{5,6},{7,9}}; // 4x2 matrix 

     // testing 
     printTranspose(transpose(matrix)); 
     printTranspose(transpose(matrix1)); 
     printTranspose(transpose(matrix2)); 
     printTranspose(transpose(matrix3)); 
     printTranspose(transpose(matrix4));  
    } 

    public static void printTranspose(int [][] transpose){ 
     for(int i=0; i<transpose.length ; i++, System.out.println()){ 
      for(int j=0; j<transpose[0].length; j++){ 
       System.out.print(transpose[i][j] + "\t"); 
      } 
     } 
     System.out.println("-------------------------"); 
    } 

    public static int[][] transpose(int[][] matrix){ 
     // ArrayList to collect every column 
     ArrayList<Integer> oneColumn = new ArrayList<Integer>(); 
     // ArrayList to collect all Columns 
     List<ArrayList<Integer>> columns = new ArrayList<ArrayList<Integer>>(); 
     // take the dimension of the array 
     int rs = matrix.length; 
     int cols = matrix[0].length; 

     // start collecting the elements 
     for(int i=0; i<rs ; i++){ 
      for(int j=0; j<cols; j++){ 
       oneColumn.add(matrix[i][j]); 
      } 
      columns.add(oneColumn); 
      oneColumn = new ArrayList<Integer>(); 
     } 

     // create array for the final result (transpose) 
     int[][] result = new int[cols][rs]; 

     // start converting the columns to rows and collect them 
     for(int i=0; i<cols ; i++){ 
      for(int j=0; j<rs; j++){ 
       result[i][j] = columns.get(j).get(i); 
      } 
     } 

     return result; 
    } 
} 

输出

1 4 7 
2 5 8 
3 6 9 
------------------------- 
1 
2 
------------------------- 
1 4 7 
------------------------- 
1 4 
2 5 
3 6 
------------------------- 
1 4 6 8 
2 5 7 9 
------------------------- 
+0

我需要通过分而治之的方法来完成它,它是必不可少的。但是,谢谢。 –