Element-wise operations: Difference between revisions
Content deleted Content added
Added Julia language |
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}}== |