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 )
}
200_success
145k22 gold badges190 silver badges478 bronze badges
asked Dec 17, 2017 at 18:39
\$\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

answered Dec 17, 2017 at 22:56
\$\endgroup\$
5
  • 1
    \$\begingroup\$ There are two kinds of standard deviation. The sample standard deviation involves dividing by N - 1. \$\endgroup\$ Commented 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\$ Commented 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\$ Commented Dec 17, 2017 at 23:29
  • \$\begingroup\$ data.sumOf { (next - mean).pow(2) } instead of aggregate is simpler, but requires kotlin 1.4. \$\endgroup\$ Commented Aug 9, 2023 at 21:55
  • \$\begingroup\$ Did you mean "instead of fold" ? \$\endgroup\$ Commented 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).

answered Dec 17, 2017 at 18:49
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.