我需要一些帮助。我必须编写一个方法将两个矩阵相乘。这是我的代码,但我得到了IndexOutOfRangeException
。
static int[,] FalkScheme(
int[,] Matrix1,
int[,] Matrix2,
int rowcountmatrix1,
int columncountmatrix1,
int rowcountmatrix2,
int columncountmatrix2)
{
int[,] NewMatrix = new int[rowcountmatrix1, columncountmatrix2];
if (columncountmatrix1 != rowcountmatrix2)
{
throw new Exception("the dimensions of the matrices do not fit! Please try operation with other matrices again!");
}
else
{
for (int i = 0; i < rowcountmatrix1; i++)
{
for (int u = 0; u < columncountmatrix2; u++)
{
NewMatrix[i, u] = Matrix1[i, u] * Matrix2[i, u] + Matrix1[i, u + 1] * Matrix2[i + 1, u] + Matrix1[i, u + 2] * Matrix2[i + 2, u];
}
}
return NewMatrix;
}
}
你能帮我解决这个问题吗?
答案 0 :(得分:2)
您不需要任何rowcountmatrix1
.. columncountmatrix2
:询问数组的维度:
public static int [,] FalkScheme(int[,] Matrix1, int[,] Matrix2) {
if (Object.ReferenceEquals(null, Matrix1))
throw new ArgumentNullException("Matrix1");
else if (Object.ReferenceEquals(null, Matrix2))
throw new ArgumentNullException("Matrix2");
int r1 = Matrix1.GetLength(0);
int c1 = Matrix1.GetLength(1);
int r2 = Matrix2.GetLength(0);
int c2 = Matrix2.GetLength(1);
if (c1 != r2)
throw new ArgumentOutOfRangeException("Matrix2", "Matrixes dimensions don't fit.");
int[,] result = new int[r1, c2];
// Naive matrix multiplication: O(n**3)
// Use Strassen algorithm O(n**2.81) in case of big matrices
for (int r = 0; r < r1; ++r)
for (int c = 0; c < c2; ++c) {
int s = 0;
for (int z = 0; z < c1; ++z)
s += Matrix1[r, z] * Matrix2[z, c];
result[r, c] = s;
}
return result;
}
测试
int[,] a = new int[,] { {1, 2, 3}, {4, 5, 6}};
int[,] b = new int[,] { { 5, 6 }, { 7, 8 } , {9, 10}};
// 46 52
// 109 124
int[,] c = Problems.FalkScheme(a, b);
答案 1 :(得分:0)
在一个循环中,你使用i或u来计算限制,并且包含代码i+1
或u+1
,这会使你超出限制 - 假设rowcount是行数你的数组,比如10,最后一次迭代中的i + 1将是10,并且当数组为0索引时,没有第10个元素,因为你从0开始
答案 2 :(得分:0)
我可以看到你会得到一个“超出范围”的例外。
假设矩阵是5行和5列,例如两个矩阵中最低指数为0,0,最高指数为4,4。在你循环中你从0,0到4,4所以当你在4,4时你会找到“Matrix2 [i,u + 2]”这是4,6。它高于4,4因此OutOfRangeException。
您需要以下内容:
for (int i = 0; i < rowcountmatrix1; i++)
{
for (int u = 0; u < columncountmatrix2; u++)
{
NewMatrix[i, u] = 0; // The position in the new Matrix we need to calculate
for (int x = 0; x < rowcountmatrix2 /* same as columncountmatrix1 */; x++)
{
NewMatrix[i, u] += Matrix1[i, x] * Matrix2[x, u];
}
}
}
答案 3 :(得分:0)
你有:
Matrix1[i, u] * Matrix2[i, u] + Matrix1[i, u + 1] * Matrix2[i + 1, u] + Matrix1[i, u + 2] * Matrix2[i + 2, u]
(三个学期)。您的方法是否只是分别乘以大小为m×3
和3×n
的矩阵?另外,将三个术语的总和更改为columncountmatrix1
(== rowcountmatrix2
)术语的总和。
考虑类似
的内容Enumerable.Range(0, columncountmatrix1).Sum(x => Matrix1[i, x] * Matrix2[x, u]);
正如其他人所说,两个矩阵的大小都内置在数组对象中,所以你的方法不应该把它们作为单独的参数。
答案 4 :(得分:0)
实际上你需要三个for循环 请尝试以下代码。
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
C[i,j] = 0;
for (int k = 0; k < M; k++)
{
C[i,j] += A[i,k] * B[k,j];
}
}
}