Niklas Nebel wrote:
sc/source/core/tool/interpr3.cxx, method ScInterpreter::ScCorrel.
Calc uses indeed the *naïve algorithm* to compute the Correlation
Coefficient (see Wikipedia).
if (!pMat1->IsString(i,j) && !pMat2->IsString(i,j))
{
fValX = pMat1->GetDouble(i,j);
fValY = pMat2->GetDouble(i,j);
fSumX += fValX;
fSumSqrX += fValX * fValX;
fSumY += fValY;
fSumSqrY += fValY * fValY;
fSumXY += fValX*fValY;
fCount++;
}
The rewritten algorithm would look like:
unsigned int count = 0; // Counter for values
// DO WE NEED AN ??? fCount ??? OR is (unsigned int) count OK
double fMeanX = 0.0;
double fMeanY = 0.0;
for (SCSIZE j = 0; j < nR1; j++) {
if (!pMat1->IsString(i,j) && !pMat2->IsString(i,j))
{
fValX[count] = pMat1->GetDouble(i,j);
fValY[count] = pMat2->GetDouble(i,j);
fMeanX += fValX[count];
fMeanY += fValY[count];
// ALTERNATIVELY SORT FIRST X AND Y AND
// CALCULATE THE MEANS IN A SEPARATE LOOP
// FOR GREATER ACCURACY
}
}
if (count < 2)
SetNoValue();
else {
fMeanX = fMeanX/count;
fMeanY = fMeanY/count;
for(j = 0; j <= count; j++) {
fSum += (fValX[j] – fMeanX) * (fValY[j] – fMeanY);
fSDX += (fValX[j] – fMeanX) * (fValX[j] – fMeanX);
fSDY += (fValY[j] – fMeanY) * (fValY[j] – fMeanY);
}
fVal = fSum / (SQRT(fSDX * fSDY) );
if( (fVal >= -1.0) && (fVal <= 1.0) ) {
PushDouble( fSum / (SQRT(fSDX * fSDY) ) ); }
else {
// REPORT AN ERROR: INVALID VALUE
// ALGORITHM FAILED
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]