-
Notifications
You must be signed in to change notification settings - Fork 15
Home
Laeeth Isharc edited this page Apr 25, 2017
·
3 revisions
Welcome to the excel-d wiki!
XLW C++ example:
LPXLFOPER EXCEL_EXPORT xlStats(LPXLFOPER inTargetRange) {
EXCEL_BEGIN;
XlfOper xlTargetRange(inTargetRange);
// Temporary variables.
double averageTmp = 0.0;
double varianceTmp = 0.0;
// Iterate over the cells in the incoming matrix.
for (RW i = 0; i < xlTargetRange.rows(); ++i)
{
for (RW j = 0; j < xlTargetRange.columns(); ++j)
{
// sums the values.
double value(xlTargetRange(i,j).AsDouble());
averageTmp += value;
// sums the squared values.
varianceTmp += value * value;
}
}
size_t popSize = xlTargetRange.rows() * xlTargetRange.columns();
// avoid divide by zero
if(popSize == 0)
{
THROW_XLW("Can't calculate stats on empty range");
}
// Initialization of the results Array oper.
XlfOper result(1, 2);
// compute average.
double average = averageTmp / popSize;
result(0, 0) = average;
// compute variance
result(0, 1) = varianceTmp / popSize - average * average;
return result;
EXCEL_END;
}
`
in D:
import std.algorithm:map,sum;
import std.range:front;
@Register(ArgumentText("input range to calculate statistics for"),
HelpTopic("excel-d"),
FunctionHelp("calculates mean and variance for input array"),
ArgumentHelp(["input range to calculate statistics for"]))
auto xlStats(double[][] inTargetRange)
{
auto numCells = (inTargetRange.length > 0) ?
inTargetRange.length * inTargetRange.front.length : 0;
auto means = inTargetRange.map!(row => row.sum).sum / numCells;
auto sumSquares = inTargetRange.map!( row => row.map!(cell => cell*cell).sum).sum;
return [means, sumSquares / numCells - means];
}
`