尝试编写拉普拉斯展开式,因为我在大学学习拉普拉斯展开式,但在获取大矩阵的小矩阵时我陷入了困境。这始终是方阵,并且小矩阵始终比大矩阵小 1 个大小,这样:matrix = nxn =>minor = (n-1)x(n-1)。
在代码的这一部分中,我得到了小数,对于矩阵第一行的元素“a”,小数由与元素“a”不在同一行或同一列中的所有值组成:
float minor[matrixDimension-1][matrixDimension-1];
for (i = 0; i < matrixDimension; i++) {
for (j = 1; j < matrixDimension; j++) {
for (k = 0; k < matrixDimension; k++) {
if(k != i) {
minor[j-1][k-1] = matrix[j][k];
}
}
}
printf("minor: \n");
printf("%f, ", minor[0][0]);
printf("%f, \n", minor[0][1]);
printf("%f, ", minor[1][0]);
printf("%f, \n", minor[1][1]);
}
我希望矩阵“次要”始终填充正确的
matrix[j][k]
值,但按照从左到右、从上到下的顺序。
当使用 3x3 矩阵和 2x2 小数进行测试时,小数仅在第一个 for 循环的第一次迭代中是正确的,因为这条线是我能想到的填充小数的最佳行minor[j-1][k-1] = matrix[j][k];
。
小矩阵:
{{1,2,3},{4,5,6},{7,8,9}}
预期结果:
minor:
5.000000, 6.000000,
8.000000, 9.000000,
minor:
4.000000, 6.000000,
7.000000, 9.000000,
minor:
4.000000, 5.000000,
7.000000, 8.000000,
我得到了什么:
minor:
5.000000, 6.000000,
8.000000, 9.000000,
minor:
5.000000, 7.000000,
8.000000, 9.000000,
minor:
5.000000, 7.000000,
8.000000, 9.000000,
请勿使用
k-1
作为 minor
中的索引。您需要一个从 0
开始计数的索引变量,除非您因为 i == k
而跳过一列。因此,使用另一个变量并仅在 if
块中递增它;
#include <stdio.h>
int main() {
const int matrixDimension = 3;
float matrix[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
float minor[matrixDimension-1][matrixDimension-1];
for (int i = 0; i < matrixDimension; i++) {
for (int j = 1; j < matrixDimension; j++) {
int kdest = 0;
for (int k = 0; k < matrixDimension; k++) {
if(k != i) {
minor[j-1][kdest] = matrix[j][k];
kdest++;
}
}
}
printf("minor: \n");
printf("%f, ", minor[0][0]);
printf("%f, \n", minor[0][1]);
printf("%f, ", minor[1][0]);
printf("%f, \n", minor[1][1]);
}
}