C++ ncc归一化互相关代码
时间: 2023-10-03 13:05:54 浏览: 233
以下是C++实现的ncc归一化互相关代码:
```cpp
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
void ncc(const vector<double>& a, const vector<double>& b, vector<double>& c) {
int n = a.size(), m = b.size();
c.resize(n - m + 1);
double ma = 0, mb = 0;
for (int i = 0; i < m; ++i) {
ma += a[i];
mb += b[i];
}
ma /= m;
mb /= m;
double sa = 0, sb = 0;
for (int i = 0; i < m; ++i) {
sa += (a[i] - ma) * (a[i] - ma);
sb += (b[i] - mb) * (b[i] - mb);
}
sa = sqrt(sa / m);
sb = sqrt(sb / m);
for (int i = 0; i < n - m + 1; ++i) {
double s = 0;
for (int j = 0; j < m; ++j) {
s += (a[i + j] - ma) * (b[j] - mb);
}
c[i] = s / (m * sa * sb);
}
}
int main() {
vector<double> a = {1, 2, 3, 4, 5, 6, 7, 8, 9};
vector<double> b = {2, 3, 4};
vector<double> c;
ncc(a, b, c);
for (int i = 0; i < c.size(); ++i) {
cout << c[i] << ' ';
}
cout << endl;
return 0;
}
```
这里实现的是一维ncc归一化互相关,输入为两个一维向量a和b,输出为一个一维向量c,表示a与b的ncc归一化互相关结果。具体实现过程如下:
1. 计算向量a和向量b的均值ma和mb,以及标准差sa和sb。
2. 对于a和b的每一个可能的对齐位置i,计算a[i:i+m-1]与b的ncc归一化互相关结果,即a[i:i+m-1]与b的内积除以(m * sa * sb)。
3. 将所有的ncc归一化互相关结果存储在向量c中返回。
需要注意的是,这里的ncc归一化互相关结果的取值范围在[-1, 1]之间,可以用来度量两个向量的相似程度。
阅读全文