【发布时间】:2015-12-17 13:55:45
【问题描述】:
将两个多维数组相乘,例如,一个 1 维数组与一个 3 维数组:
[1 2] * reshape(1:8,2,2,2)
给我错误信息:
LoadError: MethodError: `*` has no method matching *(::Array{Int64,2}, ::Array{Int64,3})
Closest candidates are:
*(::Any, ::Any, !Matched::Any, !Matched::Any...)
*{TA,TB}(::Union{DenseArray{TA,1},DenseArray{TA,2},SubArray{TA,1,A<:DenseArray{T,N},I<:Tuple{Vararg{Union{Colon,Int64,Range{Int64}}}},LD},SubArray{TA,2,A<:DenseArray{T,N},I<:Tuple{Vararg{Union{Colon,Int64,Range{Int64}}}},LD}}, !Matched::Base.LinAlg.AbstractTriangular{TB,S<:AbstractArray{T,2}})
*{TA,TQ,N}(::Union{DenseArray{TA,N},SubArray{TA,N,A<:DenseArray{T,N},I<:Tuple{Vararg{Union{Colon,Int64,Range{Int64}}}},LD}}, !Matched::Union{Base.LinAlg.QRCompactWYQ{TQ,M<:AbstractArray{T,2}},Base.LinAlg.QRPackedQ{TQ,S<:AbstractArray{T,2}}})
...
while loading In[167], in expression starting on line 1
in Ac_mul_B at operators.jl:157
使用多维矩阵代数的数学定义进行(1 乘 2)*(2 乘 2 乘 2)矩阵/数组的乘法。
一个更一般的例子可以是 A*B = C 表示 sum_k A_{i,j,k} B_{k,l,m} = C_{i,j,l,m},其中 A 是 3 -索引矩阵,或者你喜欢的张量,B 是一个 3 索引的,结果 C 是一个四索引矩阵/张量,但是,一般来说,可以有任意数量的维度,一个维度可以有任意大小(在合理范围内)。查看有关matrix product 或tensor contraction 定义的更多信息。
在 Julia 中这个乘法的正确语法是什么?
【问题讨论】:
-
使用
.*而不是* -
“多维矩阵代数的数学定义”是什么意思。张量积?矩阵之间的张量积由
kron得到。还是元素乘积.*? -
@mschauer 为了使其足够通俗易懂,A*B = CI 表示 sum_k A_{i,j,k} B_{k,l,m} = C_{i,j,l ,m},其中 A 是一个 3 索引矩阵,或者你喜欢的张量,B 是一个 3 索引矩阵,结果 C 是一个四索引矩阵/张量。有关矩阵乘积的定义,请参见:en.wikipedia.org/wiki/…。我上面的定义只是对 n>2 的 n 维矩阵的概括。如果你熟悉Matlab,这个操作是由
*那里完成的。 -
@Vincent Zoonekynd 没错!
标签: arrays matrix julia matrix-multiplication