C 如何将逆数组的指针传递给函数?

C 如何将逆数组的指针传递给函数?,c,pointers,C,Pointers,将指针传递到函数时,是否可以反转mu?有一个原始功能: void norm1(float *F, float *mu, int N, int nav) { for (int i=0; i<N; i++) { int bl = i/nav; F[i] *= 2*nav / mu[bl]; } } void norm1(浮点*F,浮点*mu,整数N,整数nav){ 对于(int i=0;i使用: //分配一个数组来保存mu的倒数 浮动*mu_inv=malloc(N*

将指针传递到函数时,是否可以反转
mu
?有一个原始功能:

void norm1(float *F, float *mu, int N, int nav) {
  for (int i=0; i<N; i++) {
    int bl = i/nav;
    F[i] *= 2*nav / mu[bl];
  }
}
void norm1(浮点*F,浮点*mu,整数N,整数nav){
对于(int i=0;i使用:

//分配一个数组来保存mu的倒数
浮动*mu_inv=malloc(N*sizeof(*mu_inv));
//计算mu的倒数并将其分配给新分配的数组。
对于(int i=0;i
使用:

//分配一个数组来保存mu的倒数
浮动*mu_inv=malloc(N*sizeof(*mu_inv));
//计算mu的倒数并将其分配给新分配的数组。
对于(int i=0;i
使用:

//分配一个数组来保存mu的倒数
浮动*mu_inv=malloc(N*sizeof(*mu_inv));
//计算mu的倒数并将其分配给新分配的数组。
对于(int i=0;i
使用:

//分配一个数组来保存mu的倒数
浮动*mu_inv=malloc(N*sizeof(*mu_inv));
//计算mu的倒数并将其分配给新分配的数组。
对于(int i=0;i

1/mu
如果
mu
是一个
float*
对我来说没有意义。请澄清你的问题。但是你意识到当你在函数范围内重新声明输入变量时,你的函数会屏蔽输入变量
bl
?我知道,但如果它是一个float,我会用那种方式来做。我问你是否有办法如果它是一个
float*
,那么就这样做吧。如果你只是想避免除法,那么就不要——你最终会把除法移到你在循环中找到倒数的地方,而不是表达式的地方,但是你仍然需要它……所以你只是在不保存任何东西的情况下添加不必要的乘法。@Dmitri同意,除非函数
norm2如果
mu
是一个
float*
,则使用相同的
mu
1/mu在循环中调用
对我来说没有意义。请澄清您的问题。但是,当您在函数范围内重新声明时,您的函数会屏蔽输入变量
bl
?我知道,但如果它是一个float,我会我想问,如果它是一个
浮点数*
,是否有办法做到这一点。如果你只是想避免除法,不要——你最终会把除法移到你在循环中找到倒数而不是表达式的地方,但你仍然需要它……所以你只是在不保存的情况下添加不必要的乘法任何东西。@Dmitri都同意,除非函数
norm2
在循环中使用相同的
mu
1/mu
调用,如果
mu
是一个
float*
,我就不理解了。请澄清您的问题。但是,当您在内部重新声明时,您的函数会屏蔽输入变量
bl
函数作用域?我知道,但如果它是一个浮点,我会这样做。我问如果它是一个
float*
,是否有办法做到这一点。如果你只是想避免除法,不要——你最终会将除法移到循环中找到相反的表达式,而不是表达式的地方,但你仍然需要它……所以你需要只要添加不必要的乘法而不保存任何内容。@Dmitri同意,除非函数
norm2
在循环中使用相同的
mu
1/mu
调用,否则如果
mu
是一个
float*
,我认为没有意义。请澄清你的问题。但你知道你的函数掩盖了input变量
bl
当你在函数范围内重新声明它时?我知道,但如果它是一个浮点,我会用那种方式来做。我问如果它是一个
float*
,是否有办法做它。如果你只是想避免除法,不要--你会把除法移到你找到相反的地方,而不是表达式Session在循环中,但您仍然需要它…因此您只是添加了不必要的乘法,而没有保存任何内容。@Dmitri同意,除非函数
norm2
在循环中使用相同的
mu
。否则将不起作用,尝试将&mu_inv用作norm2中的数组将导致内存冲突。这是OP想要的我猜,但实际上这不会节省任何时间,对吗?你仍然会进行除法,这将是很长的一部分,现在我们也分配一个数组。我猜如果我们在循环中调用
norm2
,或者使用相同的
mu_inv
…@Ben,这是正确计算的一种方法。无论分配/取消分配mem的成本如何从OP的问题来看,计算逆是一个障碍。@RSahu我同意,只是想值得一提的是,这实际上不会节省任何时间,但它会将除法从回答问题的函数内部移到外部。谢谢你的回答。@Ben,我使用Nvidia的CUDA,在GPU上除法非常有用效率低下,所以我尝试加速它。不起作用,尝试在norm2中使用&mu_inv作为数组将导致内存冲突。我想这是OP想要的,但实际上这不会节省任何时间,对吗?你仍然会进行除法,这将是很长的一部分,而且现在我们也分配一个数组。我想如果我们调用
norm2
I在一个循环或具有相同
mu_inv
…@Ben的东西中,这是正确计算的一种方法。分配/取消分配内存和计算的成本
void norm2(float *F, float *mu, int N, int nav) {
  for (int i=0; i<N; i++) {
    int bl = i/nav;
    F[i] *= 2*nav * mu[bl];
  }
}
// Allocate an array to hold the inverse of mu
float* mu_inv = malloc(N*sizeof(*mu_inv));

// Compute the inverse of mu and assign it to the newly allocated array.
for ( int i = 0; i < N; ++i )
{
   mu_inv[i] = 1.0f/mu[i];
}

// Call norm2 with the inverse of mu
norm2(F, mu_inv, N, bl);

// Deallocate memory
free(mu_inv);