Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中实现迭代自相关过程+;用于循环 我用C++中的自相关方法来实现基音跟踪,但我努力写实际的代码行,执行自相关。_C++_For Loop - Fatal编程技术网

在C+中实现迭代自相关过程+;用于循环 我用C++中的自相关方法来实现基音跟踪,但我努力写实际的代码行,执行自相关。

在C+中实现迭代自相关过程+;用于循环 我用C++中的自相关方法来实现基音跟踪,但我努力写实际的代码行,执行自相关。,c++,for-loop,C++,For Loop,我有一个数组,其中包含预记录信号的一定数量的振幅值(“值”),我正在对这些值中的一组(N)执行自相关函数 为了执行自相关,我取了原始数组并将其反转,使点0=点N,点1=点N-1等,该数组称为revarray 以下是我想做的数学计算: (array[0] * revarray[0]) (array[0] * revarray[1]) + (array[1] * revarray[0]) (array[0] * revarray[2]) + (array[1] * revarray[1]) + (a

我有一个数组,其中包含预记录信号的一定数量的振幅值(“值”),我正在对这些值中的一组(N)执行自相关函数

为了执行自相关,我取了原始数组并将其反转,使点0=点N,点1=点N-1等,该数组称为revarray

以下是我想做的数学计算:

(array[0] * revarray[0])
(array[0] * revarray[1]) + (array[1] * revarray[0])
(array[0] * revarray[2]) + (array[1] * revarray[1]) + (array[2] * revarray[0])
(array[0] * revarray[3]) + (array[1] * revarray[2]) + (array[2] * revarray[1]) + (array[3] * revarray[0])
……等等。这将对阵列[900]->阵列[1799]等重复,直到对阵列中的所有样本执行自相关

执行自相关的次数为:

值/N=测量值

这是我的代码到目前为止的相关部分

for (k = 0; k = measurements; ++k){
    for (i = k*(N - 1), j = k*N; i >= 0; i--, j++){
        revarray[j] = array[i];
        for (a = k*N; a = k*(N - 1); ++a){
            autocor[a]=0;
            for (b = k*N; b = k*(N - 1); ++b){
                autocor[a] += //**Here is where I'm confused**//
            }
        }
    }
}
我知道我想不断地向autocor[a]添加新值,但我的问题是需要添加的值会不断变化。我尝试过使用这样的递增计数:

for (i = (k*N); i = k*(N-1); ++i){
    autocor[i] += array[i] * revarray[i-1]
}
但我清楚地知道,这将不起作用,因为当新值添加到以前的autocor[I]时,以前的值将不正确,当I=0时,将无法使用revarray[I-1]进行计算


有什么建议吗?我已经为此挣扎了一段时间了。如图所示,我设法使其仅在单个阵列上工作(一次不采集N个样本),但我认为使用倒置阵列是一种更有效的方法,我只是在努力通过采集整个信号的部分来实现自相关。

我不太清楚,但是我假设您需要执行迭代的次数与数组中元素的次数相同(如果确实只有一半,则相应地调整代码)

另外,假定
N
表示数组的大小,因此最后一个元素的索引为
N-1

循环看起来是这样的:

for(size_t i = 0; i < N; ++i){
    autocorr[i] = 0;
    for(size_t j = 0; j <= i; ++j){
        const size_t idxA = j
                   , idxR = i - j;  // direct and reverse indices in the array
        autocorr[i] += array[idxA] * array[idxR];
    }
}
(大小i=0;i{ 自动相关[i]=0;
对于(size_t j=0;j)你是对的,我只需要使用一半的自相关函数就可以计算出所需的值,一旦自相关函数正常工作,我会调整代码以反映这一点。我的循环中的值是从a=k*N;a=k*(N-1)开始的,以反映最后一个元素是N-1(我发表评论太早了,现在我将通读你的其余答案)绝对的救命恩人。这是我数周来一直在努力做的事情,现在终于奏效了,非常感谢!我真不敢相信,当你发现自己的筑巢深度超过两个层次时,你应该停下来想想自己是否走对了轨道;-)大多数问题都是由于简单的事情过于复杂造成的。