【问题标题】:What is wrong with my matrix multiplication method?我的矩阵乘法方法有什么问题?
【发布时间】:2012-02-14 20:50:04
【问题描述】:

我正在使用java编写一个矩阵乘法方法。我的班级是Table,这是一个二维数组。这是Table的构造函数:

public Table(int n, int m, int val)
    {
        assert(n > 0 && m > 0);
        elements = new int[n][m];

        for(int row = 0; row < elements.length; row++)
        {
            for(int col = 0; col < elements[row].length; col++)
            {
                elements[row][col] = val;
            }
        }
    }

这就是我所说的方法:

public static Table product(Table a, Table b)
    {
        assert(a.numCols() == b.numRows()) : "different dimensions!" + null;
        Table c = new Table(a.numRows(), b.numCols(),0);
        int res = 0;

        for(int row = 0; row < a.numRows(); row++)
        {
            for(int col = 0; col < b.numCols(); col++)
            {
                for(int k = 0; k < a.numCols(); k ++)
                {
                    res = res + a.get(row, k) * b.get(k, col);
                    c.set(row, col, res);
                }
            }

        }
        System.out.println(c.toString());
        return c;

    }

方法 product 应该返回一个新的Table,它是 a 和 b 相乘的结果。我认为它应该做什么已经很清楚了。问题是它只能正确计算c[0][0];所以c.get(0,0) 计算正确,但之后的结果不是。你看到我做错了吗?感谢您的帮助。

【问题讨论】:

  • c.get(1,1)的结果是什么?
  • 这与您的问题无关,但您在滥用断言。断言应该用于您认为不可能的事件,例如。 if (x&lt;0) { doThis(); } else if ( x &gt;0 ) { doThat(); } else if ( x==0 ) { theOtherThing();} else { assert false ; } 如果我的逻辑是正确的,则断言永远不会发生,如果断言发生则表明我的逻辑有缺陷。列数与行数不匹配的情况最好用某种异常处理。

标签: java arrays multidimensional-array matrix


【解决方案1】:

看起来很奇怪的第一件事是:

int res = 0;

它也应该在其他地方重置。希望有帮助:)

...
        for(int col = 0; col < b.numCols(); col++)
        {
            res = 0;
            for(int k = 0; k < a.numCols(); k ++)
....

【讨论】:

    【解决方案2】:

    res 仅在整个循环集之外一直设置为零。它的值在您的乘法核心例程中没有多大意义。重新检查你的循环逻辑。

    【讨论】:

      【解决方案3】:

      在第一个循环中重置 res(可能需要对循环进行一些重新排序,还没有检查过并且矩阵是很久以前的)或者只是更改

      res = res + a.get(row, k) * b.get(k, col);
      

      res = c.get(row, col) + a.get(row, k) * b.get(k, col);
      

      【讨论】:

        【解决方案4】:

        int res = 0; 应该在第二个和第三个 for 循环之间。

        【讨论】:

          猜你喜欢
          • 2014-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多