以方便的方式返回两个矩阵的函数

标签 function julia

我想在 Julia 中创建一个返回两个矩阵的函数。一种方法如下:

function AB(n,m)
    A = rand(n,n)
    B = rand(m,m)
    return (A = A, B = B)
end
输出如下所示:
julia> AB(2,3)                                                                   
(A = [0.7001462182920173 0.5485248069467998; 0.8559801029748708 0.8023848206563642], B = [0.7970654693626167 0.08666821253389378 0.45550050243098306; 0.5436826530244554 0.9204593389763813 0.9270606176586167; 0.7055633627200892 0.3702008285594489 0.670758477684624])  
输出不是特别方便。我想要的是类似于函数 qr() 的东西。来自 LinearAlgebra返回。例如:
julia> qr(rand(3,3))                                                             
LinearAlgebra.QRCompactWY{Float64,Array{Float64,2}}
Q factor:
3×3 LinearAlgebra.QRCompactWYQ{Float64,Array{Float64,2}}:
 -0.789051  -0.570416   -0.228089
 -0.213035  -0.0941769   0.972495
 -0.576207   0.815939   -0.0472084
R factor:
3×3 Array{Float64,2}:
 -0.929496  -0.563585  -0.787584
  0.0        0.377304  -0.505203
  0.0        0.0       -0.01765
此输出对于至少了解这些矩阵的外观非常有用。
如何创建一个返回矩阵的函数,如函数 qr()来自 LinearAlgebra ?
任何帮助深表感谢!

最佳答案

您需要定义自己的 display方法。我在这里展示了一种抽象方法,以便您可以轻松地重用它。
我们从一个装饰器父类(super class)型开始——所有具有这个父类(super class)型的结构都会被很好地显示出来。

abstract type Pretty end
这是实际的实现:
function Base.display(x::Pretty)
    for f in fieldnames(typeof(x))
         print(f," is a ")
         display(getfield(x,f))
    end
 end
现在让我们看看吧。您只需定义任何 struct ,例如:
struct S{T}  <: Pretty
    a::Matrix{T}
    b::Matrix{T}
end
现在你有了你需要的东西,例如:
julia> S(rand(2,3), rand(3,2))
a is a 2×3 Matrix{Float64}:
 0.40661   0.753072   0.708016
 0.371099  0.0948791  0.538046
b is a 3×2 Matrix{Float64}:
 0.670715  0.457208
 0.353189  0.0248713
 0.455794  0.136496

关于以方便的方式返回两个矩阵的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66323949/

相关文章:

Java 新手 : Are the two ways of function definition identical

javascript - onClick javascript 函数仅显示包装器的第一个子项

VBA查找最大值,不使用MAX函数并打印相应的单元格

javascript - var functionName = function() {} vs function functionName() {}

arrays - 在 julia 中高效构建数组字典

performance - 为什么我的 Julia 代码运行速度比 javascript 慢?

Julia - UnderVarError

ruby-on-rails - Rails - 函数 - 可重用代码块 - 如何? - 重构

arrays - 在索引处增加 StaticVector

julia - 滚动阵列,均匀圆形移位