我被困在这里。我有一个大小为NxN的矩阵存储在一个双数组中。然后我想删除一个给定的列,让我们说第一列。所以我创建了一个大小为NxN-1的新双数组,并将值从第一个矩阵复制到第二个矩阵,当然除了第一列。但后来我想将第一个数组设置为第二个数组。我在这里消隐。
double matrix[N][N]
//fill up the matrix code here...
// remove first column of array
double newMatrix[N][N-1];
for(i = 0; i < N; i++){
for(j = 1; j < N; j++){
newMatrix[i][j-1] = matrix[i][j];
}
}
matrix = newMatrix; // how do I set this correctly? Do I need to realloc the first array?
答案 0 :(得分:2)
你不能在C中分配数组,我假设你的编译器告诉你。要进行此类动态内存管理,您需要使用指针而不是数组。我建议你仔细阅读malloc()
和free()
的工作方式,以便你可以做你想做的事。
修改强>
如果您只是删除列(或行),则会想到另一个解决方案:跟踪数组中使用的行数和列数。然后,您可以删除原始数组中的行或列,而无需先创建副本。只需将数据移到左侧(或向上)的删除列(或行),然后减小您的大小计数器。 (我希望这是有道理的。如果不让我知道,我会详细说明。)
答案 1 :(得分:1)
double matrix[2][3] = {1,2,3,4,5,6}; //declaring a 2 by 3 matrix
for (i=0;i<2;i++) //rows
{
for (j=0;j<3-1;j++) //columns - 1
{
printf("%.1f ",matrix[i][j]); //I chose to display matrix...
}
printf("\n");
}
答案 2 :(得分:1)
可以选择从array + stride_x[x] + stride_y[y]
访问元素,而不是从数组[i] [j]访问元素;其中数组最初是作为double matrix[N*N];
或double *matrix = malloc(sizeof(double)*N*N);
引入的。
stride_y [x]最初将包含所有行的列偏移量:0 1 2 3 4 ... N-1和stride_y [y]将包含相似的偏移量乘以原始行宽度0 N 2 * N 3 * N ..
从这些1-D阵列中,可以更轻松地删除或交换完整的行和列,这可能在例如方便。递归执行行列式计算/ Gauss Jordan消除。