Skip to content

Commit 9a9ddac

Browse files
authored
Make scalar multiplication type stable (#900)
* Make scalar multiplication type stable Also provide a unary + operator. * Add tests for inferring linear algebra * We cannot infer for Julia 1.1 * Add more @inferred tests * New version 1.1.2
1 parent 4ab1d80 commit 9a9ddac

File tree

3 files changed

+20
-6
lines changed

3 files changed

+20
-6
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "StaticArrays"
22
uuid = "90137ffa-7385-5640-81b9-e52037218182"
3-
version = "1.1.1"
3+
version = "1.1.2"
44

55
[deps]
66
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"

src/linalg.jl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import Base: +, -, *, /, \
44
# Vector space algebra
55

66
# Unary ops
7+
@inline +(a::StaticArray) = map(+, a)
78
@inline -(a::StaticArray) = map(-, a)
89

910
# Binary ops
@@ -17,11 +18,11 @@ import Base: +, -, *, /, \
1718
@inline -(a::StaticArray, b::AbstractArray) = map(-, a, b)
1819

1920
# Scalar-array
20-
@inline *(a::Number, b::StaticArray) = broadcast(*, a, b)
21-
@inline *(a::StaticArray, b::Number) = broadcast(*, a, b)
21+
@inline *(a::Number, b::StaticArray) = map(c->a*c, b)
22+
@inline *(a::StaticArray, b::Number) = map(c->c*b, a)
2223

23-
@inline /(a::StaticArray, b::Number) = broadcast(/, a, b)
24-
@inline \(a::Number, b::StaticArray) = broadcast(\, a, b)
24+
@inline /(a::StaticArray, b::Number) = map(c->c/b, a)
25+
@inline \(a::Number, b::StaticArray) = map(c->a\c, b)
2526

2627

2728
# With UniformScaling

test/linalg.jl

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ StaticArrays.similar_type(::Union{RotMat2,Type{RotMat2}}) = SMatrix{2,2,Float64,
1919

2020
@test @inferred(v1 * c) === @SVector [4,8,12,16]
2121
@test @inferred(v1 / c) === @SVector [1.0,2.0,3.0,4.0]
22-
@test @inferred(c \ v1)::SVector @SVector [1.0,2.0,3.0,4.0]
22+
@test @inferred(c \ v1)::SVector === @SVector [1.0,2.0,3.0,4.0]
23+
24+
@test @inferred(+v1) === @SVector [+2,+4,+6,+8]
25+
@test @inferred(-v1) === @SVector [-2,-4,-6,-8]
2326

2427
@test @inferred(v1 + v2) === @SVector [6, 7, 8, 9]
2528
@test @inferred(v1 - v2) === @SVector [-2, 1, 4, 7]
@@ -36,6 +39,16 @@ StaticArrays.similar_type(::Union{RotMat2,Type{RotMat2}}) = SMatrix{2,2,Float64,
3639
#@test @inferred(v3 + v2) === @SVector [6, 7, 8, 9]
3740
#@test @inferred(v1 - v4) === @SVector [-2, 1, 4, 7]
3841
#@test @inferred(v3 - v2) === @SVector [-2, 1, 4, 7]
42+
43+
if VERSION v"1.2"
44+
# #899 matrix-of-matrix
45+
A = SMatrix{1,1}([1])
46+
B = SMatrix{1,1}([A])
47+
@test @inferred(1.0 * B) === SMatrix{1, 1, SMatrix{1, 1, Float64, 1}, 1}(B)
48+
@test @inferred(1.0 \ B) === SMatrix{1, 1, SMatrix{1, 1, Float64, 1}, 1}(B)
49+
@test @inferred(B * 1.0) === SMatrix{1, 1, SMatrix{1, 1, Float64, 1}, 1}(B)
50+
@test @inferred(B / 1.0) === SMatrix{1, 1, SMatrix{1, 1, Float64, 1}, 1}(B)
51+
end
3952
end
4053

4154
@testset "Interaction with `UniformScaling`" begin

0 commit comments

Comments
 (0)