sesodesa
sesodesa

Reputation: 1603

Julia v1.1: create an array of matrices

I'm attempting to create an array of matrices by multiplying a t = range(0,stop=2*pi,length=101) by a matrix [1, 0] as follows

A = t .* [1 ,0]

but this produces the error ERROR: LoadError: DimensionMismatch("arrays could not be broadcast to a common size"). I would like each scalar, or element of t to be multiplied elementwise (in terms of t) with the elements of the vector [1 , 0], essentially performing an elementwise scalar--matrix product.

The reason I'm doing this is because I would later like to be able to multiply another constant matrix M with each column vector found in A. How can this be done in Julia v1.1?

Upvotes: 1

Views: 420

Answers (1)

Bogumił Kamiński
Bogumił Kamiński

Reputation: 69819

You have to wrap the element you do not want to be broadcasted over in a container. Here is a standard way to do it (I decreased length kwarg to 3 to make the example more clear):

julia> t = range(0,stop=2*pi,length=3)
0.0:3.141592653589793:6.283185307179586

julia> A = t .* Ref([1 ,0])
3-element Array{Array{Float64,1},1}:
 [0.0, 0.0]
 [3.141592653589793, 0.0]
 [6.283185307179586, 0.0]

julia> Ref([1 2; 3 4]) .* A
3-element Array{Array{Float64,1},1}:
 [0.0, 0.0]
 [3.141592653589793, 9.42477796076938]
 [6.283185307179586, 18.84955592153876]

Instead of Ref container you can also use a 1-element tuple or 1-element vector as wrappers:

julia> t .* ([1 ,0],)
3-element Array{Array{Float64,1},1}:
 [0.0, 0.0]
 [3.141592653589793, 0.0]
 [6.283185307179586, 0.0]

julia> t .* [[1 ,0]]
3-element Array{Array{Float64,1},1}:
 [0.0, 0.0]
 [3.141592653589793, 0.0]
 [6.283185307179586, 0.0]

The reason why Ref should be preferred is that it is 0-dimensional, so that it is the most neutral of these three methods (i.e. influences the output in the least way - retaining the broadcast style of the other argument). Here are some examples:

julia> f1(x) = x .* (2, )
f1 (generic function with 1 method)

julia> f2(x) = x .* [2]
f2 (generic function with 1 method)

julia> f3(x) = x .* Ref(2)
f3 (generic function with 1 method)

julia> f1(1)
(2,)

julia> f2(1)
1-element Array{Int64,1}:
 2

julia> f3(1)
2

julia> f1((1,2))
(2, 4)

julia> f2((1,2))
2-element Array{Int64,1}:
 2
 4

julia> f3((1,2))
(2, 4)

Upvotes: 1

Related Questions