// Multiply X by n-1 x n matrix to give n-1 contrasts // Return a ColumnVector ReturnMatrix Helmert(const ColumnVector& X, bool full) { REPORT Tracer et("Helmert * CV"); int n = X.nrows(); if (n == 0) Throw(ProgramException("X Vector of length 0", X)); Real sum = 0.0; ColumnVector Y; if (full) Y.resize(n); else Y.resize(n-1); for (int i = 1; i < n; ++i) { sum += X(i); Y(i) = (i * X(i+1) - sum) / sqrt((Real)i * (i+1)); } if (full) { sum += X(n); Y(n) = sum / sqrt((Real)n); } Y.release(); return Y.for_return(); }
// same as above for X a ColumnVector, length n, element j = 1; otherwise 0 ReturnMatrix Helmert(int n, int j, bool full) { REPORT Tracer et("Helmert:single element "); if (n <= 0) Throw(ProgramException("X Vector of length <= 0")); if (j > n || j <= 0) Throw(ProgramException("Out of range element number ")); ColumnVector Y; if (full) Y.resize(n); else Y.resize(n-1); Y = 0.0; if (j > 1) Y(j-1) = sqrt((Real)(j-1) / (Real)j); for (int i = j; i < n; ++i) Y(i) = - 1.0 / sqrt((Real)i * (i+1)); if (full) Y(n) = 1.0 / sqrt((Real)n); Y.release(); return Y.for_return(); }