Element-wise operations: Difference between revisions

Content deleted Content added
Added Julia language
PureFox (talk | contribs)
Added Kotlin
Line 1,078: Line 1,078:
841 961 1369)
841 961 1369)
</lang> And similarly for <tt>+</tt>, <tt>-</tt>, <tt>%</tt> (division), and <tt>^</tt> .
</lang> And similarly for <tt>+</tt>, <tt>-</tt>, <tt>%</tt> (division), and <tt>^</tt> .

=={{header|Kotlin}}==
<lang scala>// version 1.1.51

typealias Matrix = Array<DoubleArray>
typealias Op = Double.(Double) -> Double

fun Double.dPow(exp: Double) = Math.pow(this, exp)

fun Matrix.elementwiseOp(other: Matrix, op: Op): Matrix {
require(this.size == other.size && this[0].size == other[0].size)
val result = Array(this.size) { DoubleArray(this[0].size) }
for (i in 0 until this.size) {
for (j in 0 until this[0].size) result[i][j] = this[i][j].op(other[i][j])
}
return result
}

fun Matrix.elementwiseOp(d: Double, op: Op): Matrix {
val result = Array(this.size) { DoubleArray(this[0].size) }
for (i in 0 until this.size) {
for (j in 0 until this[0].size) result[i][j] = this[i][j].op(d)
}
return result
}

fun Matrix.print(name: Char?, scalar: Boolean? = false) {
println(when (scalar) {
true -> "m $name s"
false -> "m $name m"
else -> "m"
} + ":")
for (i in 0 until this.size) println(this[i].asList())
println()
}

fun main(args: Array<String>) {
val ops = listOf(Double::plus, Double::minus, Double::times, Double::div, Double::dPow)
val names = "+-*/^"
val m = arrayOf(
doubleArrayOf(3.0, 5.0, 7.0),
doubleArrayOf(1.0, 2.0, 3.0),
doubleArrayOf(2.0, 4.0, 6.0)
)
m.print(null, null)
for ((i, op) in ops.withIndex()) m.elementwiseOp(m, op).print(names[i])
val s = 2.0
println("s = $s:\n")
for ((i, op) in ops.withIndex()) m.elementwiseOp(s, op).print(names[i], true)
}</lang>

{{out}}
<pre>
m:
[3.0, 5.0, 7.0]
[1.0, 2.0, 3.0]
[2.0, 4.0, 6.0]

m + m:
[6.0, 10.0, 14.0]
[2.0, 4.0, 6.0]
[4.0, 8.0, 12.0]

m - m:
[0.0, 0.0, 0.0]
[0.0, 0.0, 0.0]
[0.0, 0.0, 0.0]

m * m:
[9.0, 25.0, 49.0]
[1.0, 4.0, 9.0]
[4.0, 16.0, 36.0]

m / m:
[1.0, 1.0, 1.0]
[1.0, 1.0, 1.0]
[1.0, 1.0, 1.0]

m ^ m:
[27.0, 3125.0, 823543.0]
[1.0, 4.0, 27.0]
[4.0, 256.0, 46656.0]

s = 2.0:

m + s:
[5.0, 7.0, 9.0]
[3.0, 4.0, 5.0]
[4.0, 6.0, 8.0]

m - s:
[1.0, 3.0, 5.0]
[-1.0, 0.0, 1.0]
[0.0, 2.0, 4.0]

m * s:
[6.0, 10.0, 14.0]
[2.0, 4.0, 6.0]
[4.0, 8.0, 12.0]

m / s:
[1.5, 2.5, 3.5]
[0.5, 1.0, 1.5]
[1.0, 2.0, 3.0]

m ^ s:
[9.0, 25.0, 49.0]
[1.0, 4.0, 9.0]
[4.0, 16.0, 36.0]
</pre>


=={{header|Mathematica}} / {{header|Wolfram Language}}==
=={{header|Mathematica}} / {{header|Wolfram Language}}==