【问题标题】:Array{Float64,2} problem when multiplying matrixes Julia矩阵相乘时的 Array{Float64,2} 问题 Julia
【发布时间】:2019-10-19 10:12:15
【问题描述】:

我正在用矩阵做一些相当简单的事情:

for i in 1:N
  X=XT[1:2,i]
  A[i]=X'*Sig*X+b
end

其中 XT 是我从 Matlab 导入的一个数组 (1×5 Array{Any,2}),通过这样做我得到了 Array{Float64,2} 类型的 X。而 Sig 是一个 2x2 矩阵,也是 Array{Float64,2}。

问题是:X'SigX 的结果是 Array{Float64,2} 类型,尽管只有一个元素。我无法将其与 b 相加。

我知道我可以放一个点并求和,但如果我这样做,我仍然会拥有这个数组类型,并将其存储在另一个数组中,这可能会很混乱。

有什么想法可以让它保持简单吗?

【问题讨论】:

  • A的维数是多少?它也是 Array{Float64,2},它的大小是多少?您希望求和的结果是存储在 A 中的数组还是只是存储在 A[i] 中的标量?
  • 这很奇怪。 XT[1:2, i] 应该是向量,而不是矩阵。很奇怪。
  • 我希望将其存储为 Float64。 A 也应该是 Array{Float64,2}。
  • 您能否编辑您的问题以包括阵列 A 和 XT 的初始化?如何做到这一点很重要。
  • 我已经编辑过了。碰巧的是,我的数组 XT 不是普通矩阵。这就是问题所在。看来我可以做 XT[i][:] 并获得正确的尺寸,但我不知道为什么它不会以其他方式发生。

标签: arrays types casting julia


【解决方案1】:

Julia 明确区分元素和元素数组。其他一些对类型不太明确的语言(如 R 和 Matlab)将单元素矩阵视为一个数字,用户习惯于隐式地这样做。然而,在 Julia 中,这两件事是根本不同的——一个是数字的容器,另一个是数字。

所以答案很简单,执行(X'*Sig)[1]first(X'*Sig) 以取出元素。在即将推出的 Julia 版本中,您应该能够明确地为只有一个元素的容器执行 only(X'*Sig)

它简单明了,只是与 Matlab 或 R 不同。“简单”在语言中的含义实际上存在根本的哲学差异。在 R 或 Matlab 中,我会说“简单”的意思是“没有太多的操作/字符”。在 Julia 中,“简单”的意思是“清晰、明确、直截了当的推理”。这只是一种不同的哲学,需要一些时间来适应。

【讨论】:

  • 这是我的第一种回答方法,但实际上 OP 的代码中还有另一个错误:X=XT[1:2,i] 给出了XT 中的前两个元素(前两个数组)(1D 数组数组)当i 为 1 时,否则为错误。第一行没有为此目的适当地索引XT。还有A[]可以访问唯一的元素。
  • MAT.jl 将 MATLAB 的行或列向量读取为 Julia 的二维矩阵。如果将X 设为Vector,例如vec,则可以避免OP 的1x1 矩阵问题。 v'*M*v 自动使用 LinearAlgebra.dot 给出一个标量而不是一个数组,并且以一种避免矩阵乘法的高性能方式这样做。这要归功于 Andreas Peter,他今天在 Julia Slack 的#helpdesk 频道上解释了这个解决方案。
  • 不错,视野开阔。
猜你喜欢
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多