C++ 光谱角分类算法实现及编译错误解决
C++ 光谱角分类算法实现及编译错误解决
本文展示了使用 C++ 实现光谱角分类算法的代码示例,并分析了编译错误“band”被多次定义的解决方法。
算法实现
void CSupervised::SpectralAngle(int Rows, int Cols, int Bands, int number, float AverageValue[][200], LPSTR *pPointer)
{
unsigned char *array = new unsigned char[Rows*Cols];
CFile g;
if(!g.Open('spectral_angle_class', CFile::modeCreate|CFile::modeWrite|CFile::typeBinary))
{
AfxMessageBox('输出文件打开失败!', MB_ICONHAND);
delete [] array;
return;
}
for(int data = 0; data < Rows*Cols; data++, pPointer += Bands)
{
float min = FLT_MAX;
int index = 0;
for(int i = 0; i < number; i++)
{
float dot = 0, a = 0, b = 0;
for(int j = 0; j < Bands; j++)
{
dot += (*pPointer[j]) * AverageValue[i][j];
b += AverageValue[i][j] * AverageValue[i][j];
}
a = sqrt(b) * sqrt(Bands);
float distance = acos(dot / a) * 180.0 / M_PI;
if(distance < min)
{
min = distance;
index = i + 1;
}
}
array[data] = index;
}
g.Write(array, Rows*Cols);
g.Close();
delete [] array;
AfxMessageBox('光谱角分类数据处理完毕!');
}
void CBsqViewView::OnSpectralAngle()
{
if(!m_fileopen || bigdlg->Areas == 0)
{
AfxMessageBox('错误:没有可选的区域进行分类!', MB_ICONERROR | MB_OK, 0);
return;
}
CSupervised object;
LPSTR *pData = new LPSTR[Bands]();
for(int i = 0; i < Bands; i++)
{
pData[i] = (LPSTR)HeapAlloc(GetProcessHeap(), 0, Height*Width);
if(!pData[i])
{
AfxMessageBox('内存分配失败!', MB_ICONHAND);
delete [] pData;
return;
}
m_file.ReadHuge(pData[i], Height*Width);
}
object.SpectralAngle(Height, Width, Bands, bigdlg->Areas, bigdlg->GrayValue, pData);
for(int i = 0; i < Bands; i++)
{
HeapFree(GetProcessHeap(), 0, pData[i]);
}
delete [] pData;
m_file.Close();
}
编译错误解决
代码中的编译错误“band”被多次定义,是因为在函数 OnSpectralAngle() 中,已经定义了变量 “band”,而在 for 循环中又重新定义了 “band”,导致重复定义。解决方法是将 for 循环中的变量名改为其他名称,避免与已有变量重名。例如:
for(int i = 0; i < Bands; i++)
{
pData[i] = (LPSTR)HeapAlloc(GetProcessHeap(), 0, Height*Width);
if(!pData[i])
{
AfxMessageBox('内存分配失败!', MB_ICONHAND);
delete [] pData;
return;
}
m_file.ReadHuge(pData[i], Height*Width);
}
总结
本文介绍了使用 C++ 实现光谱角分类算法的代码示例,并分析了编译错误“band”被多次定义的解决方法。在编写代码时,需要注意变量名重复定义的问题,避免出现编译错误。
原文地址: https://www.cveoy.top/t/topic/jpGp 著作权归作者所有。请勿转载和采集!