我有这个功能,其中2个矢量相互比较,程序找到与矢量的平方差的总和。
double Search::NNS(vector<vector<double>> bb, vector<vector<double>> aa)
{
int M = 768; int N = 1024;
int R = 49; int C = 36;
//double SSD[] = MainVectorBlock[] - WallyVector[];
//double SSD[] = SSD[] * SSD[];
//sum = sum + SSD[];
vector<vector<double>> &MainIMG = bb;
vector<vector<double>> &WallyIMG = aa;
double *SSD = new double[R*C];
double sum = 0;
for (int bx = 0; bx < M; bx += R)
for (int by = 0; by < N; by += C)
{
Compare = new double*[R];
for (int x = 0; ((x < R) && ((bx + x) < M)); ++x)
{
Compare[x] = new double[R];
for (int y = 0; ((y < C) && ((by + y) < N)); ++y)
{
if ((bx + x) >= M)
{
cout << Compare[bx + x] << Compare[by + y] << " ";
}
//cout << MainIMG[bx + x][by + y] << " ";
Compare[x][y] = MainIMG[bx + x][by + y] - WallyIMG[x][y];
Compare[x][y] = Compare[x][y] * Compare[x][y];
//sum += Compare[x][y];
SSD[R*C] += Compare[x][y];
//SSD[R*C] = sum;
//cout << Compare[x][y] << " ";
}
}
//cout << "\n\n\n" << endl;
//cout << sum << endl;
//cout << SSD[R*C] << "\t" << sum << endl;
for (int i = 0; i < R*C; i++)
{
for (int j = 0; j < R*C; j++)
{
if (SSD[i] > SSD[j])
{
int temp = SSD[i];
SSD[i] = SSD[j];
SSD[j] = temp;
}
}
}
}
for (int a = 0; a < R*C; a++)
{
cout << SSD[a] << endl;
}
return 0;
}
我可以显示所有平方差值的总和,但是当我尝试按升序对值进行排序时,我继续得到这个值-6.27744e + 66。 我试图改变循环并将其放在主循环中,但我仍然继续获得该值。
答案 0 :(得分:1)
double *SSD = new double[R*C];
您已分配内存,但从未将其初始化为某个值。然后你直接使用它:
SSD[R*C] += Compare[x][y];
在开始为其添加值之前,将SSD
的所有项初始化为0
。
答案 1 :(得分:0)
您的代码存在多个问题。
NNS
函数,当它们应该通过const
引用传递时。for
循环中创建内存泄漏。SSD
末尾的文件。这是一个没有内存泄漏的函数版本,并且允许你来解决上面的第3项。虽然这可以改进,但它没有上述问题。
#include <vector>
#include <iostream>
#include <algorithm>
double Search::NNS(const std::vector<std::vector<double>>& bb,
const std::vector<std::vector<double>>& aa)
{
int M = 768; int N = 1024;
int R = 49; int C = 36;
const std::vector<std::vector<double>> &MainIMG = bb;
const std::vector<std::vector<double>> &WallyIMG = aa;
std::vector<double> SSD(R * C);
double sum = 0;
for (int bx = 0; bx < M; bx += R)
{
for (int by = 0; by < N; by += C)
{
std::vector<std::vector<double>> Compare(R, std::vector<double>(R));
for (int x = 0; ((x < R) && ((bx + x) < M)); ++x)
{
for (int y = 0; ((y < C) && ((by + y) < N)); ++y)
{
Compare[x][y] = MainIMG[bx + x][by + y] - WallyIMG[x][y];
Compare[x][y] = Compare[x][y] * Compare[x][y];
SSD.at(R*C) += Compare[x][y];
}
}
}
}
std::sort(SSD.begin(), SSD.end());
for (int a = 0; a < R*C; a++)
std::cout << SSD[a] << std::endl;
return 0;
}
问题1)通过const引用传递vector
来解决。正如原始代码所做的那样,按照值传递矢量会产生不必要的副本。
问题2)使用std::vector
代替new[]
来解决。现在没有内存泄漏。
问题3)不直接解决。所做的是使用std::vector::at()
来证明发生了越界条件。如果在使用std::out_of_range
时超出范围,将抛出at()
异常,表明数组访问中存在错误。一旦执行该行,您的代码就会停止。这是我留给你解决边界条件的地方。
您可能还想在at()
向量上使用Compare
,以确保您不会在那里超出范围。我很懒,不想在脑海里进行计算,但只要你有for
个循环条件不使用vector::size()
作为限制条件,而是使用计算来确定环路有多远,它看起来很可疑,并且是出现越界情况的候选者。
此外,当您使用new[]
时,无法保证您会收到此错误,并且根据您的说法,您没有得到任何迹象表明您做错了什么。使用std::vector
可以使用at()
检查边界条件。
问题4)使用std::vector<double>
解决,默认情况下,向量会将内容初始化为0。
最后,请注意使用std::sort
对范围进行排序,而不是慢速冒泡排序。