Consider the following code
function test(m,B)
@show typeof(B)
all_u = rand(m,10)
one_u = all_u[:,1]
B*one_u
end
# Works
@show test(3, [1 1 1; 2 2 2])
# Works
@show test(2, [1 1; 2 2])
# Fails
@show test(1, [1; 2])
The last line fails with
`*` has no method matching *(::Array{Int64,1}, ::Array{Float64,1})
because B is now a 1-D vector (which is not OK), and so is one_u (which is always the case, and doesn't cause issues).
How can I write test(m,B) to handle the m==1 case that doesn't require actually special casing it for m==1 (i.e. using an if)? I know that for m==1 case I could actually write another method to dispatch on the fact that B is a Vector but that seems terribly wasteful.
Quoting from your follow-up comment:
Bis sometimes a matrix, sometimes a vector/1D matrix - that's the problem.
You can convert a vector to a 2D array with the "slicing" operation [:;:]. In other words, if B has type Array{T,1}, then B[:,:] has type Array{T,2}:
julia> B = [1; 2]
2-element Array{Int64,1}:
1
2
julia> typeof(B[:, :])
Array{Int64,2}
On the other hand, if B already has type Array{T,2}, then [:;:] is a no-op:
julia> B = [1 1; 2 2]
2x2 Array{Int64,2}:
1 1
2 2
julia> typeof(B[:, :])
Array{Int64,2}
julia> B[:, :] == B
true
Therefore, in order to accommodate your function definition for the case m==1 (i.e. convert B to a 2D array when needed), you can simply substitute B[:,:]*one_u for B*one_u:
julia> function test(m, B)
@show typeof(B)
all_u = rand(m, 10)
one_u = all_u[:, 1]
B[:, :] * one_u
end
test (generic function with 1 method)
julia> @show test(3, [1 1 1; 2 2 2])
typeof(B) => Array{Int64,2}
test(3,[1 1 1;2 2 2]) => [1.4490640717303116,2.898128143460623]
2-element Array{Float64,1}:
1.44906
2.89813
julia> @show test(2, [1 1; 2 2])
typeof(B) => Array{Int64,2}
test(2,[1 1;2 2]) => [0.9245851832116978,1.8491703664233956]
2-element Array{Float64,1}:
0.924585
1.84917
julia> @show test(1, [1; 2])
typeof(B) => Array{Int64,1}
test(1,[1,2]) => [0.04497125985152639,0.08994251970305278]
2-element Array{Float64,1}:
0.0449713
0.0899425
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With