33 template <
class TInput1,
class TInput2,
class TOutput>
48 inline TOutput
operator()(
const TInput1& itA,
const TInput2& itB)
const
50 double epsilon = 0.01;
54 for (
unsigned long pos = 0; pos < itA.Size(); ++pos)
57 vecA.push_back(
static_cast<double>(itA.GetPixel(pos)));
58 vecB.push_back(
static_cast<double>(itB.GetPixel(pos)));
64 return static_cast<TOutput
>(-std::log(
static_cast<double>(
PhiMI(vecA, vecB) + epsilon)));
75 for (itx = vx.begin(); itx < vx.end(); ++itx)
77 Ex +=
static_cast<TOutput
>(*itx);
84 for (itx = vx.begin(); itx < vx.end(); ++itx)
86 Vx +=
static_cast<TOutput
>(std::pow(
static_cast<double>((*itx) - Ex), 2));
91 for (itx = vx.begin(); itx < vx.end(); ++itx)
93 (*itx) = ((*itx) - Ex) /
static_cast<TOutput
>(std::sqrt(
static_cast<double>(Vx)));
106 for (itx = vx.begin(), ity = vy.begin(); itx < vx.end(); ++itx, ++ity)
110 Exy += (*itx) * (*ity);
117 return Exy - Ex * Ey;
147 for (itx = vx.begin(), ity = vy.begin(), itz = vz.begin(), itt = vt.begin(); itx < vx.end(); ++itx, ++ity, itz++, itt++)
154 Exy += (*itx) * (*ity);
155 Exz += (*itx) * (*itz);
156 Ext += (*itx) * (*itt);
157 Eyz += (*ity) * (*itz);
158 Eyt += (*ity) * (*itt);
159 Ezt += (*itz) * (*itt);
161 Exyz += (*itx) * (*ity) * (*itz);
162 Exyt += (*itx) * (*ity) * (*itt);
163 Exzt += (*itx) * (*itz) * (*itt);
164 Eyzt += (*ity) * (*itz) * (*itt);
166 Exyzt += (*itx) * (*ity) * (*itz) * (*itt);
186 TOutput result = Exyzt - Exyz * Et - Exyt * Ez - Exzt * Ey - Eyzt * Ex + Exy * Ez * Et + Exz * Et * Ey + Ext * Ey * Ez + Eyz * Et * Ex + Eyt * Ex * Ez +
187 Ezt * Ex * Ey - 3 * Ex * Ey * Ez * Et;
205 TOutput Eabcd_c =
Exyztc(va, vb, vc, vd);
207 TOutput Eab_c =
Exyc(va, vb);
208 TOutput Eac_c =
Exyc(va, vc);
209 TOutput Ead_c =
Exyc(va, vd);
210 TOutput Ecd_c =
Exyc(vc, vd);
211 TOutput Ebd_c =
Exyc(vb, vd);
212 TOutput Ebc_c =
Exyc(vb, vc);
214 return Eabcd_c - Eab_c * Ecd_c - Eac_c * Ebd_c - Ead_c * Ebc_c;
221 donnees.push_back(v1);
222 donnees.push_back(v2);
229 TOutput termeR = 0.0;
230 TOutput termeQ = 0.0;
232 for (iti = donnees.begin(); iti < donnees.end(); ++iti)
233 for (itj = donnees.begin(); itj < donnees.end(); ++itj)
236 termeR +=
static_cast<TOutput
>(std::pow(
static_cast<double>(
Rxy((*iti), (*itj))), 2));
238 for (
itk = donnees.begin();
itk < donnees.end(); ++
itk)
239 for (itl = donnees.begin(); itl < donnees.end(); itl++)
241 if ((iti != itj) || (iti !=
itk) || (iti != itl))
242 termeQ +=
static_cast<TOutput
>(std::pow(
static_cast<double>(
Qxijkl((*iti), (*itj), (*
itk), (*itl))), 2));
246 return 1.0 / 4.0 * termeR + 1.0 / 48.0 * termeQ;