我正在使用java编写矩阵乘法。我的班级是Table
,这是一个2D数组。这是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;
}
方法产品应该返回一个新的Table
,它是a和b相乘的结果。我认为它应该做的很清楚。问题是它只能正确计算c[0][0]
;因此c.get(0,0)
被正确计算,但之后的结果不是。你看到我做错了吗?感谢您的帮助。
答案 0 :(得分:2)
看起来奇怪的第一件事是:
int res = 0;
它也应该在其他地方重置。希望有所帮助:)
...
for(int col = 0; col < b.numCols(); col++)
{
res = 0;
for(int k = 0; k < a.numCols(); k ++)
....
答案 1 :(得分:1)
res
仅在整个循环集之外设置为零。它的值在你的乘法核心例程中没有多大意义。重新检查你的循环逻辑。
答案 2 :(得分:1)
在第一个循环中重置res(可能需要对循环进行一些重新排序,检查并且矩阵很久以前)或者只是更改
res = res + a.get(row, k) * b.get(k, col);
到
res = c.get(row, col) + a.get(row, k) * b.get(k, col);
答案 3 :(得分:1)
int res = 0;
应位于第二个和第三个for循环之间。