我是元编程的新手,所以我可能不明白这一点。我认为,@nloops宏在Base.Cartesian中的目的是在未知维度的情况下,对任意数量的嵌套for循环进行编码。在该模块的文档中,给出了以下示例:
@nloops 3 i A begin
s += @nref 3 A i
end
评估结果为
for i_3 = 1:size(A,3)
for i_2 = 1:size(A,2)
for i_1 = 1:size(A,1)
s += A[i_1,i_2,i_3]
end
end
end
在这里,数字3是先验已知的。然而
遵循的方法,我试图在的概念中理解朱莉娅中究竟发生了什么以及表达式和生成的函数是如何工作的。
目标是使用表达式和生成的函数优化递归函数(对于具体的示例,您可以查看上面提供的链接中回答的问题)。
考虑以下修改的fibonacci函数,其中我要计算fibonacci级数直到n,然后乘以一个数字p。
直接的递归实现将是
function fib(n::Integer, p::Real)
if n <= 1
return 1 * p
else
return n * fib(n-1, p)
end
end
作为第一步,我可以定义一个返回表达式而
我有一个类型AbstractT,对于每个子类型,我想定义一个构造函数T(x::Tuple),但是我找不到一种通用的方法来完成它,因为像这样的朱莉娅中的所有东西都使用分派,但是我不能在构造函数上分派,因为构造函数的名称与类型匹配,所以每个构造函数都是不同的函数。也就是说,如果有一个
construct{T<:AbstractT}(::Type{T},x::Tuple) = # Define all the constructors
我在内部这样做,但是它不能很好地与其他软件包一起工作,这些包将直接调用T(x)和error。朱莉娅是不是以某种我可以利用的方式来利用引擎盖下的调度?
在Python中,您可以为传递给另一个函数(reference)的可调用对象指定参数和返回值。例如: def foo(
bar: Callable[[str],int], # a function that takes a string as an argument and returns an int
baz: List[str] # a list of strings
) -> List[int]: # returns a list of ints
return [bar(s) for s in baz]
foo(len,["hello&
例如,我有一个基本类型的抽象类型,我希望实现一个类型工厂,它在这个抽象类型下动态地创建具体类型,并使用用户输入参数给出的名称(和其他类型特征)。
abstract type AbstractFoo end
function TypeFactory(typename::String, supertype::DataType)
...
return ConcreteSubtype
end
函数TypeFactory使用typename和supertype参数,并创建一个属于supertype的具体类型,其名称与typename相同。
我知道这种类工厂在Python (例如)中实现
试图理解参数类型和内部方法可用的new函数。手动声明“内部构造函数可用的特殊函数,它创建了一个新的类型对象”。请参阅手册中关于新 的部分和关于内部构造器方法的手册一节。
考虑一个用于计算x之和的内部方法,其中x可以是向量或元组,并给出参数类型T。想要的一件自然的事情是,x的元素的类型由它们的和s继承。我似乎不需要new了,对吧?
struct M{T}
x::T
s
function M(x)
s = sum(x)
x,s
end
end
julia> M([1,2,3])
([1, 2, 3], 6)
julia&g
为了构建性能良好的队列应用程序,我正在重新阅读Julia语言文档,而关于参数构造函数和外部构造函数的部分让我感到困惑。他们展示的例子如下:
julia> struct OurRational{T<:Integer} <: Real
num::T
den::T
function OurRational{T}(num::T, den::T) where T<:Integer
if num == 0 && den == 0
e
我正在阅读这本书(统计反思),这本书有R语言的代码,我想用Julia的代码重现同样的代码。在这本书中,他们计算了9次试验中6次成功的可能性,其中成功的概率为0.5。他们使用下面的R代码来实现这一点。 #R Code
dbinom(6, size = 9, prob=0.5)
#Out > 0.1640625 我想知道如何在朱莉娅身上做同样的事情, #Julia
using Distributions
b = Binomial(9,0.5)
# Its possible to look at random value,
rand(b)
#Out > 5 但是我
当我运行下面的代码时,fminbox或Optim.autodiff函数似乎创建了一个类型为数组{Float64{matching...Array},1}的向量,因为我得到了错误消息"fbellmanind没有方法matching...Array{Dual{Float64},1}“。我已经指定了函数fbellmanind来接受Array{Any,1},但没有成功。有什么想法吗?
function fbargsolve(x::Vector)
fbellmanind(probc,EV,V,Ind,x,V0,VUnemp0,Vnp,Vp,q,obj,assets,EmpState,i)
f
我对朱莉娅有点陌生,但我在Python方面有一些知识。我现在正在学习朱莉娅,我想知道如何从朱莉娅的Numpy中表示Python函数"zeros_like“。python代码如下:
import numpy as np
a = [3] #vector of one number
b = np.zeros_like(a)
假设我想编写一个函数,使所有bools都是假的:
function true_to_false!(boolean::Bool)
boolean = false
end
为什么我不能用它来改变另一个函数的值呢?例如:
function make_x_false()
x = true
true_to_false!(x)
return x
end
返回true。
当然,也有一些解决办法,比如
function make_x_false()
x = true
x = true_to_false!(x)
end
和
function make_x_fal
我在Julia中有以下代码,其中文字常量2.对数组元素进行乘法。我使文字常量现在单精度(2.f0),但我想让类型依赖于其他变量(这些都是Float64或所有Float32)。我该如何优雅地做这件事呢?
function diff!(
at, a,
visc, dxidxi, dyidyi, dzidzi,
itot, jtot, ktot)
@tturbo for k in 2:ktot-1
for j in 2:jtot-1
for i in 2:itot-1
我知道Julia在很大程度上依赖于即时静态类型派生(基本上所有代码都需要被认为是c++模板)。我还了解到,这意味着在对不同类型的对象使用单一算法时,只要这些类型在编译时是已知的,就不会产生运行时开销。
当谈到运行时多态性时,我不太清楚它是如何工作的。假设我们有以下情况:
abstract Shape
type Circle <: Shape
radius::Float64
end
type Square <: Shape
width::Float64
end
dist(x::Circle, y::Circle) = ...
dist(x::Circle, y:
假设我定义了一个这样的类型
type Point{Tx, Ty} end
然后我创建一个这种类型的变量,例如,
a = Point{Int64, :something}()
现在,我只知道我可以通过a获得typeof(a)的类型。就是,Point{Int64, :something}。但是,我需要的只是参数Tx和Ty。
有什么方法可以得到这些参数Tx和Ty
假设我有一个变量filename = "/home/jimmy/logger.log"。我想要一些像这样的标记文档: md"""
The output is logged at `$(filename)`
""" 据我所知,有两个变通方法: 首先: Markdown.parse("The output is logged at `" * filename * "`") 第二: str = "The output is logged at `$(filename)`"
md"
Julia中的以下代码:
function foo(a::Vector{AbstractString})
end
foo(["a"])
出现以下错误:
ERROR: MethodError: no method matching foo(::Array{String,1})
Closest candidates are:
foo(::Array{AbstractString,1}) at REPL[77]:2
即使下面的代码像预期的那样运行:
function foo(a::Vector{String})
end
foo(["a"])
此外,Abst
我已经使用SymPy包()创建了一个符号表达式。现在,我想使用根程序包()找到该表达式的根。但是,我不知道如何使用fzeros方法查找根,因为这只能应用于类型为Function的对象,而不能应用于我的表达式类型为Sym的对象。
这是我想要做的一个例子。我创建了一个符号表达式和一个符号表达式sin(x)。现在,让我们尝试查找值-10和10之间的sin(x)的零:
using SymPy
x = sym"x"
expr = sin(x)
using Roots
fzeros(expr,-10,10)
下面是错误:
ERROR: `fzeros` has no method matc
我有兴趣了解以下两个函数定义之间的实际差异(如果有的话)
function foo(n::Integer)
println("hello")
end
function foo{T<:Integer}(n::T)
println("hello")
end
据我所知,每次调用新类型T的函数时,第二种形式都会触发新的编译,但是在第一种情况下实际会发生什么呢?是否对第一种形式的性能有任何影响?
谢谢