矩阵是指纵横排列的数据表格,最早来自于方程组的系数及常数所构成的方阵,如:        a11 a12... a1n    
        
        a21 a22... a2n
            ... ... ...        am1 am2... amn 矩阵乘积规则示例如下:两个矩阵a和b可以相乘的条件是a矩阵的列数和b矩阵的行数相同,例如:假设矩阵a为“3行2列”:a11 a12 a13a21 a22 a23矩阵b为“2行3列”:b11 b12b21 b22b31 b32a和b可以相乘,乘积矩阵为:a11*b11+a12*b21+a13*b31    a11*b12+a12*b22+a13*b3
a21*b11+a22*b21+a23*b31    a21*b12+a22*b22+a23*b32Matrix类的定义如下:
public class Matrix {
private double[][] data;
private int rows;
private int cols;
public Matrix(int rows, int cols) {
     if (rows <= 0 || cols <= 0)
         throw new IllegalArgumentException(");
     this.rows = rows;
     this.cols = cols;
     data = new double[rows][cols];
}
public Matrix(int rows, int cols, String line) {
     if (rows <= 0 || cols <= 0 || line == null)
         throw new IllegalArgumentException("");
     String[] dataStr = line.split(",");
     if (  空白处1  ) {
         throw new IllegalArgumentException("");
     }
     this.rows = rows;
     this.cols = cols;
     data = new double[rows][cols];
     for (int i = 0; i < dataStr.length; i++) {
                   空白处2          
     }
}
    public Matrix mul(Matrix ma) {
     if (          空白处3          ) {
         throw new IllegalArgumentException("");
     }
     Matrix mc = new Matrix(rows, ma.cols);
     for (int i = 0; i < mc.getRows(); i++) {
         for (int j = 0; j < mc.getCols(); j++) {
             for (          空白处4          ) {
                           空白处5         
             }
         }
     }
     return mc;
}
public int getRows() {
     return rows;
}
public int getCols() {
     return cols;
}
public String toString() {
     StringBuilder sb = new StringBuilder();
     for (int i = 0; i < rows; i++) {
         for (int j = 0; j < cols - 1; j++) {
             sb.append(data[i][j]).append(",");
         }
         sb.append(data[i][cols - 1]).append("\n");
     }
     return sb.toString();
   }
}
下列选项中,能填入空白处1的代码是(    )
  A. dataStr.length != (rows-1) * (cols-1)
 B. dataStr.length != (rows-1) * cols
 C. dataStr.length != rows * cols
 D. dataStr.length != rows * (cols-1) 37. 下列选项中,能填入空白处2的代码是(    )
  A. data[i % cols][i / cols] = Double.parseDouble(dataStr[i]);
 B. data[i/cols][i % cols] = Double.parseDouble(dataStr[i]);
 C. data[i/ rows][i % rows] = Double.parseDouble(dataStr[i]);
 D. data[i % rows][i /rows] = Double.parseDouble(dataStr[i]); 38. 下列选项中,能填入空白处3的代码是(    )
  A. cols != ma.cols
 B. rows != ma.cols
 C. rows != ma.rows
 D. cols != ma.rows 39. 下列选项中,能填入空白处4的代码是(    )
  A. int k = 0; k < cols; k++
 B. int k = 0; k <ma.cols; k++
 C. int k = 0; k <rows; k++
 D. int k = 0; k <rows * ma.cols; k++ 40. 下列选项中,能填入空白处5的代码是(    )
  A. mc.data[i][j] += data[k][j] * ma.data[i][k];
 B. mc.data[i][j] += data[k][i] * ma.data[j][k];
 C. mc.data[i][j] += data[j][k] * ma.data[k][i];
 D. mc.data[i][j] += data[i][k] * ma.data[k][j];

解决方案 »

  1.   

    C//数组长度应该等于长乘以宽。
    C// data[i/cols][i % cols] = Double.parseDouble(dataStr[i]);给每一个元素赋值,第一个是得出结果是行,第二个是列。
    B//行不等于列,就报错
    B//遍历矩阵a的列数
    A//
    a11*b11+a12*b21+a13*b31 
     mc.data[i][j] += data[k][j] * ma.data[i][k];
                      b[1][1]*a[1][1]k++
                      b[2][1]*a[1][2]k++
                      b[3][1]*a[1][3]
    =b[1][1]*a[1][1]+ b[2][1]*a[1][2]+ b[3][1]*a[1][3]
    和a11*b11+a12*b21+a13*b31 对应      
      

  2.   

    第一提选C 原因 dataStr 传进来的 应该是a11,a12,a1n 然后再split(“,”)方法劈开, 利用 已经知道的 ROWS,COLS形成矩阵,假如dataStr.length != rows * cols 为true的话 就报参数异常,
    37选D,rows是行 cols是列 ROWS必须用取余(%)才跳转。
    38选B 根据例子 一个矩阵的行数必须和另外一个矩阵的列数相等才能相乘。
    接下来做不出来了
      

  3.   


    Matrix mc = new Matrix(rows, ma.cols);//第63行是如何确定矩阵大小的啊
      

  4.   

    其实你们可以这样理解
    ma就是矩阵a
    this就是矩阵b
    mc就是a矩阵乘以b矩阵的结果。
    然后把这些带入上面的算法式子,应该就能出结果。
    这里面的矩阵不是以二维数组的形式存储的,而且是一维数组存储,这点有点不好理解,其他的慢慢看,感觉没啥难的
      

  5.   

    其实就是个数学问题,关键是要把思路弄清,两个矩阵相乘的条件,以及如何相乘,再有点OOP,和循环下标的知识,应该没什么问题,关键是中国的大学学的知识容易忘,也就是说学了没用它,等于白学