我知道标题令人困惑,但我不知道如何更好地描述它,让代码自己解释一下:
我有一个第三方库将复杂的标量定义为
typedef struct {
float real;
float imag;
} cpx;
所以复杂的数组/向量就像
cpx array[10];
for (int i = 0; i < 10; i++)
{
/* array[i].real and array[i].imag is real/imag part of i-th member */
}
目前的情况是,在一个函数中,我有两个浮点数组作为参数,我使用两个临时局部复杂数组,例如:
void my_func(float *x, float *y) /* x is input, y is output, length is fixed, say 10 */
{
cpx tmp_cpx_A[10]; /* two local cpx array */
cpx tmp_cpx_B[10];
for (int i = 0; i < 10; i++) /* tmp_cpx_A is based on input x */
{
tmp_cpx_A[i].real = do_some_calculation(x[i]);
tmp_cpx_A[i].imag = do_some_other_calculation(x[i]);
}
some_library_function(tmp_cpx_A, tmp_cpx_B); /* tmp_cpx_B is based on tmp_cpx_A, out-of-place */
for (int i = 0; i < 10; i++) /* output y is based on tmp_cpx_B */
{
y[i] = do_final_calculation(tmp_cpx_B[i].real, tmp_cpx_B[i].imag);
}
}
我注意到在第一个循环之后x
没有用,第二个循环就位。如果我可以使用与和tmp_cpx_B
相同的内存进行构建,我可以节省一半的中间内存使用量。x
y
如果复数数组定义为
typedef struct{
float *real;
float *imag;
} cpx_alt;
那么我可以简单地
cpx_alt tmp_cpx_B;
tmp_cpx_B.real = x;
tmp_cpx_B.imag = y;
做剩下的,但事实并非如此。
我不能更改第三个库复杂结构的定义,也不能cpx
作为输入,因为我想向外部用户隐藏内部库而不破坏 API。
所以我想知道是否可以使用标量成员初始化结构数组,就像cpx
标量数组x
一样y
编辑1:对于一些常见的问题:
- 实际上,数组长度最多为 960,这意味着一个
tmp_cpx
数组将占用 7680 个字节。我的平台总共有 56k RAM,节省一个tmp_cpx
将节省约 14% 的内存使用量。 - 第 3 方库是 KissFFt 并在复数数组上进行 FFT,它定义了自己的
kiss_fft_cpx
而不是标准的 <complex.h> 因为它可以使用 marco 在浮点/定点计算之间切换