Julia v1.1:创建矩阵数组
Julia v1.1: create an array of matrices
我正在尝试通过将 t = range(0,stop=2*pi,length=101)
乘以矩阵 [1, 0]
来创建一个矩阵数组,如下所示
A = t .* [1 ,0]
但这会产生错误 ERROR: LoadError: DimensionMismatch("arrays could not be broadcast to a common size")
。我希望 t
的每个标量或元素与向量 [1 , 0]
的元素相乘(根据 t
),本质上执行元素标量 - 矩阵乘积。
我这样做的原因是我稍后希望能够将另一个常量矩阵 M
与 A
中的每个列向量相乘。如何在 Julia v1.1 中完成此操作?
您必须将不想被广播的元素包装在容器中。这是一个标准的方法(我将 length
kwarg 减少到 3
以使示例更清楚):
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]
除了 Ref
容器,您还可以使用 1 元素元组或 1 元素向量作为包装器:
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]
之所以首选Ref
是因为它是0维的,因此它是这三种方法中最中性的(即以最少的方式影响输出-保留广播风格另一个论点)。以下是一些示例:
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)
我正在尝试通过将 t = range(0,stop=2*pi,length=101)
乘以矩阵 [1, 0]
来创建一个矩阵数组,如下所示
A = t .* [1 ,0]
但这会产生错误 ERROR: LoadError: DimensionMismatch("arrays could not be broadcast to a common size")
。我希望 t
的每个标量或元素与向量 [1 , 0]
的元素相乘(根据 t
),本质上执行元素标量 - 矩阵乘积。
我这样做的原因是我稍后希望能够将另一个常量矩阵 M
与 A
中的每个列向量相乘。如何在 Julia v1.1 中完成此操作?
您必须将不想被广播的元素包装在容器中。这是一个标准的方法(我将 length
kwarg 减少到 3
以使示例更清楚):
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]
除了 Ref
容器,您还可以使用 1 元素元组或 1 元素向量作为包装器:
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]
之所以首选Ref
是因为它是0维的,因此它是这三种方法中最中性的(即以最少的方式影响输出-保留广播风格另一个论点)。以下是一些示例:
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)