function - 以方便的方式返回两个矩阵的函数
问题描述
我想在 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()
fromLinearAlgebra
返回的东西。例如:
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()
from LinearAlgebra
?
任何帮助深表感谢!
解决方案
您将需要定义自己的display
方法。我在这里介绍了一种抽象方法,以便您可以轻松地重用它。
我们从装饰器超类型开始——所有具有这种超类型的结构都会很好地显示出来。
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
现在让我们看看。您只需定义 any 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
推荐阅读
- angular - 无法安装 Angular CLI
- html - 悬停时弹跳关键帧动画突然停止
- r - 将图像或pdf插入R中的word文档
- c# - 无法在 Dynamics CRM 365 online 中创建系统用户
- java - 在 eclipse 中的 STS 插件中创建了一个基于 rest 和数据源的 Spring boot 应用程序 - 但得到了非法状态异常
- swift - 快速条件的含义是 if ((status & 0x3F) == 1 ){ }
- javascript - 当我将 JavaScript 块添加到函数时,它不起作用。有人可以帮忙解释为什么吗?
- c# - Input Manager 2 Players with 2 Controller
- c - C 编程 getch()、getchar()、getche()
- c# - 如何在操作系统窗口启动时始终以管理员权限启动 wpf 应用程序