1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
#include "multaln.h"
DistFunc::DistFunc()
{
m_Dists = 0;
m_uCount = 0;
m_uCacheCount = 0;
m_Names = 0;
m_Ids = 0;
}
DistFunc::~DistFunc()
{
if (0 != m_Names)
{
for (unsigned i = 0; i < m_uCount; ++i)
free(m_Names[i]);
}
delete[] m_Dists;
delete[] m_Names;
delete[] m_Ids;
}
float DistFunc::GetDist(unsigned uIndex1, unsigned uIndex2) const
{
return m_Dists[VectorIndex(uIndex1, uIndex2)];
}
unsigned DistFunc::GetCount() const
{
return m_uCount;
}
void DistFunc::SetCount(unsigned uCount)
{
m_uCount = uCount;
if (uCount <= m_uCacheCount)
return;
delete[] m_Dists;
m_Dists = new float[VectorLength()];
m_Names = new char *[m_uCount];
m_Ids = new unsigned[m_uCount];
m_uCacheCount = uCount;
memset(m_Names, 0, m_uCount*sizeof(char *));
memset(m_Ids, 0xff, m_uCount*sizeof(unsigned));
memset(m_Dists, 0, VectorLength()*sizeof(float));
}
void DistFunc::SetDist(unsigned uIndex1, unsigned uIndex2, float dDist)
{
m_Dists[VectorIndex(uIndex1, uIndex2)] = dDist;
m_Dists[VectorIndex(uIndex2, uIndex1)] = dDist;
}
unsigned DistFunc::VectorIndex(unsigned uIndex1, unsigned uIndex2) const
{
assert(uIndex1 < m_uCount && uIndex2 < m_uCount);
return uIndex1*m_uCount + uIndex2;
}
unsigned DistFunc::VectorLength() const
{
return m_uCount*m_uCount;
}
void DistFunc::SetName(unsigned uIndex, const char szName[])
{
assert(uIndex < m_uCount);
m_Names[uIndex] = strsave(szName);
}
void DistFunc::SetId(unsigned uIndex, unsigned uId)
{
assert(uIndex < m_uCount);
m_Ids[uIndex] = uId;
}
const char *DistFunc::GetName(unsigned uIndex) const
{
assert(uIndex < m_uCount);
return m_Names[uIndex];
}
unsigned DistFunc::GetId(unsigned uIndex) const
{
assert(uIndex < m_uCount);
return m_Ids[uIndex];
}
void DistFunc::LogMe() const
{
Log("DistFunc::LogMe count=%u\n", m_uCount);
Log(" ");
for (unsigned i = 0; i < m_uCount; ++i)
Log(" %7u", i);
Log("\n");
Log(" ");
for (unsigned i = 0; i < m_uCount; ++i)
Log(" %7.7s", m_Names[i] ? m_Names[i] : "");
Log("\n");
for (unsigned i = 0; i < m_uCount; ++i)
{
Log("%4u %10.10s : ", i, m_Names[i] ? m_Names[i] : "");
for (unsigned j = 0; j <= i; ++j)
Log(" %7.4g", GetDist(i, j));
Log("\n");
}
}
|