将for loop替换为C won中的memcpy';行不通
我应该尝试使用雅可比在C中更有效地进行一个简单的二维热计算。 在计算新数组之后,我必须将新值复制到旧数组中 此时,将使用将for loop替换为C won中的memcpy';行不通,c,memcpy,C,Memcpy,我应该尝试使用雅可比在C中更有效地进行一个简单的二维热计算。 在计算新数组之后,我必须将新值复制到旧数组中 此时,将使用for循环: for(j=1;j
for
循环:
for(j=1;j
我的想法是使用memcpy
,但我认为我做错了什么:
memcpy(u、utmp、sizex*sizey*sizeof(未签名));
在使用memcpy
而不是for
循环后,我的结果完全错误
整个功能:
void relax_jacobi(double *u, double *utmp, unsigned sizex, unsigned sizey) {
int i, j;
double unew, diff, sum = 0.0;
for (j = 1; j < sizex - 1; j++) {
for (i = 1; i < sizey - 1; i++) {
utmp[j * sizex + i] = 0.25 * (u[j * sizex + (i - 1)] +
u[j * sizex + (i + 1)] +
u[(j - 1) * sizex + i] +
u[(j + 1) * sizex + i]);
}
}
/*for (j = 1; j < sizex - 1; j++) {
for (i = 1; i < sizey - 1; i++) {
u[j * sizex + i] = utmp[j * sizex + i];
}
}*/
memcpy(u,utmp,sizex*sizex*sizeof(double));
}
void relax\u jacobi(double*u,double*utmp,unsigned sizex,unsigned sizey){
int i,j;
双unew,差异,和=0.0;
对于(j=1;j
我做错了什么?我以前从未真正使用过C。这是正确的方法吗
的循环从1开始,因为2x2网格在边缘不会改变。OP的memcpy(u、utmp、sizex*sizey*sizeof(double))代码>(复制所有矩阵)与下面的代码不同,代码复制的是2D矩阵的四条外边缘
for (j = 1; j < sizex - 1; j++) {
for (i = 1; i < sizey - 1; i++) {
u[j * sizex + i] = utmp[j * sizex + i];
}
}
for(j=1;j
就像
for (j = 1; j < sizex - 1; j++) {
// Copy 1 inner sub-row at a time.
memcpy(&u[j * sizex + 1], &temp[j * sizex + 1], sizeof *u * (sizey-2));
}
for(j=1;j
使用sizeof*u
而不是sizeof(double)
来避免编码错误(正如OP最初发布的那样)。OP的memcpy(u、utmp、sizex*sizey*sizeof(double))代码>(复制所有矩阵)与下面的代码不同,代码复制的是2D矩阵的四条外边缘
for (j = 1; j < sizex - 1; j++) {
for (i = 1; i < sizey - 1; i++) {
u[j * sizex + i] = utmp[j * sizex + i];
}
}
for(j=1;j
就像
for (j = 1; j < sizex - 1; j++) {
// Copy 1 inner sub-row at a time.
memcpy(&u[j * sizex + 1], &temp[j * sizex + 1], sizeof *u * (sizey-2));
}
for(j=1;j
使用sizeof*u
而不是sizeof(double)
来避免编码错误(正如OP最初发布的那样)。对于(j=1;j
-->从1开始是不寻常的memcpy()
code好像从0开始。sizeof(unsigned)
应该是sizeof(double)
。这可能是唯一的问题,也可能不是。为什么您认为需要“将新值复制到旧数组中”?如果你不这样做,几乎肯定会更好。如果old
指向旧数组,而new
指向新数组,那么(几乎可以肯定)最好是对(j=1;jold=new
。
-->从1开始是不寻常的memcpy()
code好像从0开始。sizeof(unsigned)
应该是sizeof(double)
。这可能是唯一的问题,也可能不是。为什么您认为需要“将新值复制到旧数组中”?如果你不这样做,几乎肯定会更好。如果old
指向旧数组,而new
指向新数组,则(几乎可以肯定)最好执行old=new
。