SparseEuclidianDistance.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "lib/common.h"
00012 #include "lib/io.h"
00013 #include "distance/SparseEuclidianDistance.h"
00014 #include "features/Features.h"
00015 #include "features/SparseFeatures.h"
00016
00017 CSparseEuclidianDistance::CSparseEuclidianDistance()
00018 : CSparseDistance<DREAL>(), sq_lhs(NULL), sq_rhs(NULL)
00019 {
00020 }
00021
00022 CSparseEuclidianDistance::CSparseEuclidianDistance(
00023 CSparseFeatures<DREAL>* l, CSparseFeatures<DREAL>* r)
00024 : CSparseDistance<DREAL>(), sq_lhs(NULL), sq_rhs(NULL)
00025 {
00026 init(l, r);
00027 }
00028
00029 CSparseEuclidianDistance::~CSparseEuclidianDistance()
00030 {
00031 cleanup();
00032 }
00033
00034 bool CSparseEuclidianDistance::init(CFeatures* l, CFeatures* r)
00035 {
00036 CSparseDistance<DREAL>::init(l, r);
00037
00038 cleanup();
00039
00040 sq_lhs=new DREAL[lhs->get_num_vectors()];
00041 sq_lhs=((CSparseFeatures<DREAL>*) lhs)->compute_squared(sq_lhs);
00042
00043 if (lhs==rhs)
00044 sq_rhs=sq_lhs;
00045 else
00046 {
00047 sq_rhs=new DREAL[rhs->get_num_vectors()];
00048 sq_rhs=((CSparseFeatures<DREAL>*) rhs)->compute_squared(sq_rhs);
00049 }
00050
00051 return true;
00052 }
00053
00054 void CSparseEuclidianDistance::cleanup()
00055 {
00056 if (sq_lhs != sq_rhs)
00057 delete[] sq_rhs;
00058 sq_rhs = NULL;
00059
00060 delete[] sq_lhs;
00061 sq_lhs = NULL;
00062 }
00063
00064 bool CSparseEuclidianDistance::load_init(FILE* src)
00065 {
00066 return false;
00067 }
00068
00069 bool CSparseEuclidianDistance::save_init(FILE* dest)
00070 {
00071 return false;
00072 }
00073
00074 DREAL CSparseEuclidianDistance::compute(INT idx_a, INT idx_b)
00075 {
00076 DREAL result=((CSparseFeatures<DREAL>*) lhs)->compute_squared_norm((CSparseFeatures<DREAL>*) lhs, sq_lhs, idx_a, (CSparseFeatures<DREAL>*) rhs, sq_rhs, idx_b);
00077
00078 return CMath::sqrt(result);
00079 }