我不知道任务的干细节和我试图解决的问题,我不会打扰你。我会切入正确的行列。
我需要用数据填充矩阵。矩阵是正方形,除了前2个对角线(0到n-1之间的M[i][i]
为i
,0到n-2之间的M[i][i+1]
为i
之外,一切都为零已经填满了)
我们想用这个复杂的公式来填充矩阵。
M[i][j]=max(a+min(M[i+2][j],M[i+1][j-1]) , b+min(M[i+1][j-1],M[i][j-2]))
结果是上三角矩阵。从上面的公式可以看出,为了计算第k个对角线,我们需要k-2对角线。我说前两个是给出的。
我写了一个代码来填充矩阵,它正在按预期工作。
这是我的问题:
由于它是一个上三角矩阵,下半部分全部为零。所以浪费记忆并保存它没有意义。所以我想自己而不是分配一个n乘n矩阵,我会分配n行,并且第一行ill分配n个空格,第二个n-1,第三个n-2等等...... / p>
但是由于我们改变了矩阵的维数,我上面写的计算M[i][j]
的公式现在不同了。在我看来,我们会将i'th
行,i
列中的所有值移到左侧。在第0行没有任何改变。在第1行中,我们将所有值1列向左拉,等等。如果我理解正确:
M[i][j]=M'[i][j-i]
M'
是我们的新矩阵。所以在上面的公式中插入:
M'[i][j]=max(a+min(M'[i+2][j-i],M'[i+1][j-1-i]) , b+min(M'[i+1][j-1-i],M'[i][j-2-i]))
但是现在填充矩阵的程序无法正常工作。它用垃圾填充矩阵。
以下是填充矩阵的代码:
void fill_matrix() //fills the matrix with data of optimal path, we use memoization rather than recursion, so this step is necessary.
{ //first step is to allocate the matrix. we can assume right_index==size-1 since this is the first thing we do after generating the array
int i,j;
optimum_matrix=(int**)malloc((right_index+1)*sizeof(int**));
for(j=0;j<=right_index;j++)
optimum_matrix[j]=(int*)malloc((right_index+1-j)*sizeof(int*)); //matrix allocated. upper triangular matrix. no need to allocate n^2 spaces. //to fix indices, M[i][j]=M'[i][j-i+1]. subtract i and add 1 to each column, since we moved each entry in row i, i-1 columns back.
for(i=0;i<=right_index;i++) //first diagonal
optimum_matrix[i][0]=data_array[i];
for(i=0;i<right_index;i++) //second diagonal
optimum_matrix[i][1]=get_max(data_array[i],data_array[i+1]);
for(i=0;i<=right_index;i++)
{
for(j=2;j<=right_index-i;j++)
optimum_matrix[i][j]=get_max(data_array[i]+get_min(optimum_matrix[i+2][j-i],optimum_matrix[i+1][j-i-1]),data_array[j]+get_min(optimum_matrix[i+1][j-i-1],optimum_matrix[i][j-i-2])); //here is the problem
}
}
这是打印矩阵的代码
void print_matrix()
{
int i,j,k;
for(i=0;i<=right_index;i++)
{
for(k=0;k<i;k++)
printf("0 ");
for(j=0;j<=right_index-i;j++)
printf("%d ",optimum_matrix[i][j]);
printf("\n");
}
}
即使在填充第三对角线的第一次迭代中,当它进入for循环时它会说&#34;这是问题&#34;,如果我输入printf("%d",optimum_matrix[i+2][j-i]);
它将打印垃圾。而且我不明白为什么因为公式一致。
非常感谢帮助。谢谢。
答案 0 :(得分:1)
optimum_matrix=(int**)malloc((right_index+1)*sizeof(int**));
这不是分配双数组的正确方法。它只分配双数组的一个维度。我很难按照你的逻辑来确定每行和每列的大小。因此,下面可能不是您想要的确切尺寸。但希望它确实说明了如何更正确地分配双数组。
int **optimum_matrix = malloc((right_index+1)*sizeof(int*));
for (i = 0; i < (right_index+1); i++) {
optium_matrix[i] = malloc((right_index+1)*sizeof(int));
}
顺便说一下,为了简洁起见,我省略了malloc返回值的检查。而且您的原始代码也没有检查malloc的返回值。应始终这样做。