所以,我递归地计算可变大小数组的行列式。所以,如果你熟悉如何计算行列式,这里有一张显示我在做什么的图片:
我无法发布图片,因为我没有足够的代表。这是一个链接:
http://i.stack.imgur.com/gIW1D.png
所以,让我非常困惑的部分是制作更小的 2x2 矩阵。(请记住,我正在对此进行编码以适用于任何大小的数组,而不仅仅是 3x3)。
所以我并不是真的在问如何计算行列式,只是我如何获取上面显示的 3x3 数组,并且只访问显示的部分。
所以,我递归地计算可变大小数组的行列式。所以,如果你熟悉如何计算行列式,这里有一张显示我在做什么的图片:
我无法发布图片,因为我没有足够的代表。这是一个链接:
http://i.stack.imgur.com/gIW1D.png
所以,让我非常困惑的部分是制作更小的 2x2 矩阵。(请记住,我正在对此进行编码以适用于任何大小的数组,而不仅仅是 3x3)。
所以我并不是真的在问如何计算行列式,只是我如何获取上面显示的 3x3 数组,并且只访问显示的部分。
因此,要计算 NxN 矩阵的行列式,您需要删除第一行,然后逐列删除,并计算得到的 (N-1)x(N-1) 组矩阵的行列式。为了计算这些行列式,您需要删除较小矩阵的第一行(这将是原始矩阵的第二行),然后逐一删除其他列,依此类推。
所以很容易弄清楚如何处理每个递归级别的行:在第 0 级,您通过第 0 行,在第 1 级,您通过第 1 级,依此类推。
但列更复杂。如果在第 0 级删除第 7 行,在第 1 级删除当前矩阵的第 12 行(即原始矩阵的第 13 行),在第 2 级删除当前矩阵的第 10 行,即矩阵的第 10 行也向上一级,这是矩阵的第 11 行向上两级,这是原始矩阵......很难确定在较低的递归级别访问原始矩阵的哪一列.
当然可以复制整个矩阵,去掉应该删除的列,然后将副本向下传递到递归级别。但这将是相当浪费的。
删除列号而不是列本身更优雅。为此,我们创建了一个列号的一维数组。最初它应该按顺序包含数字 0..(N-1)。当您准备计算每个子矩阵行列式时,您复制该数组,从副本中删除一个列索引,并将其传递给递归计算。
所以你的递归函数看起来大概像这样(在伪代码中)
float recursive_determinant (int N, float[N][N] matrix,
int[N] column_array, int level)
if level == N-1
return matrix[level][column_array[0]]
result = 0
for each i in 0 .. N - level
copy_of_column_array = column_array
copy_of_column_array.remove_element(i)
subdeterminant = recursive_determinant (N, matrix,
copy_of_column_array, level+1)
result = result + subdeterminant *
matrix[level][column_array[i]] * (-1)^(i+1)
return result
float determinant (int N, float[N][N] matrix)
result = recursive_determinant (N, matrix, {0, 1, ..., N-1}, 0)
根据您的图像,您拥有的是一个具有 3x3 元素的 2D 数组,并且您想使用该 2D 数组的某些元素进行计算。您的二维数组声明为int firstarray[xsize][ysize]
. 当然,如果是 xsize、ysize 或 ysize,xsize 取决于您喜欢如何使用它。在这种特定情况下,您给出的将是int firstarray[3][3]
.
然后,您可以通过获取 firstarray 的适当元素来访问较小的数组。
下面是一些动态分配的数组示例,1、2、3 和 4 维:
int * Create1D(int r)
{
int *space;
int *arr;
space = calloc(r*sizeof(int), sizeof(int));
arr = calloc(sizeof(int), sizeof(int));
arr = (int *)space;
return arr;
}
int ** Create2D(int c, int r)
{
int *space;
int **arr;
int y;
space = calloc(c*r*sizeof(int), sizeof(int));
arr = calloc(c * sizeof(int *), sizeof(int));
for(y=0;y<c;y++)
{
arr[y] = (int *)space + (y*r);
}
return arr;
}
int *** Create3D(int p, int c, int r)
{
int *space;
int ***arr;
int x,y;
space = calloc (p*c*r*sizeof(int),sizeof(int));
arr = calloc(p * sizeof(int **), sizeof(int));
for(x = 0; x < p; x++)
{
arr[x] = calloc(c * sizeof(int *),sizeof(int));
for(y = 0; y < c; y++)
{
arr[x][y] = ((int *)space + (x*(c*r) + y*r));
}
}
return arr;
}
int **** Create4D(int hR, int p, int c, int r)
{
int *space;
int ****arr;
int w,x,y;
space = calloc(hR*p*c*r*sizeof(int), sizeof(int));
arr = calloc(hR * sizeof(int ***), sizeof(int));
for(w=0;w<hR;w++)
{
arr[w] = calloc(p * sizeof(int **), sizeof(int));
for(x=0;x<p;x++)
{
arr[w][x] = calloc(c * sizeof(int *), sizeof(int));
for(y=0;y<c;y++)
{
arr[w][x][y] = ((int *)space + (w*(p*c*r) + x*(c*r) + y*r));
}
}
}
return arr;
}
这种方法可以扩展到您想要的任意多个维度。完成后不要忘记自由声明。