3
\$\begingroup\$

Here is the code. The code should counts the standard deviation for double array, but also for Int arrays.

fun calculateSD(numArray: DoubleArray): Double {
var sum = 0.0
var standardDeviation = 0.0

for (num in numArray) {
    sum += num
}

val mean = sum / numArray.size

for (num in numArray) {
    standardDeviation += Math.pow(num - mean, 2.0)
}

val divider = numArray.size - 1

return Math.sqrt(standardDeviation / divider )
}
\$\endgroup\$

2 Answers 2

4
\$\begingroup\$

You may want to be more idiomatic when working with collections, for instance:

import kotlin.math.pow
import kotlin.math.sqrt

fun sd(data: DoubleArray): Double {
    val mean = data.average()
    return data
        .fold(0.0, { accumulator, next -> accumulator + (next - mean).pow(2.0) })
        .let { sqrt(it / data.size )
    }
}

BTW, I don't think that data.size - 1 is correct

\$\endgroup\$
5
  • 1
    \$\begingroup\$ There are two kinds of standard deviation. The sample standard deviation involves dividing by N - 1. \$\endgroup\$ Dec 17, 2017 at 23:13
  • \$\begingroup\$ True: en.wikipedia.org/wiki/Bessel%27s_correction . Do you think that this is the case here ? \$\endgroup\$ Dec 17, 2017 at 23:27
  • \$\begingroup\$ You could complain about unclear naming or lack of documentation for this function, but I'd hesitate to call it "wrong". \$\endgroup\$ Dec 17, 2017 at 23:29
  • \$\begingroup\$ data.sumOf { (next - mean).pow(2) } instead of aggregate is simpler, but requires kotlin 1.4. \$\endgroup\$
    – Groostav
    Aug 9, 2023 at 21:55
  • \$\begingroup\$ Did you mean "instead of fold" ? \$\endgroup\$ Aug 10, 2023 at 19:43
1
\$\begingroup\$

Performance

Something to consider (in general) is whether Math.pow(x, 2.0) is going to be optimized by the interpreter/compiler into x * x or not. The former can be slower if, say, it is computed as Math.exp(Math.log(x) * 2.0).

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.