我有一个数组,我想使用高斯滤波器对其进行过滤,类似于scipy.ndimage.filter.gaussian_filter1d在 Python 中。
什么包最适合这个,我将如何使用它?
我从这里知道:
Julia 函数参数遵循有时称为“传递共享”的约定,这意味着值在传递给函数时不会被复制。函数参数本身充当新的变量绑定(可以引用值的新位置),但它们引用的值与传递的值相同。在函数中对可变值(例如数组)所做的修改对调用者是可见的。这与 Scheme、大多数 Lisps、Python、Ruby 和 Perl 以及其他动态语言中的行为相同。
鉴于此,我很清楚要通过引用传递,您需要做的就是将可变类型传递给函数并进行编辑。
那么我的问题就变成了,我如何清楚地区分传值和传引用?有没有人有一个例子显示一个函数被调用了两次?一次是按引用传递,一次是按值传递?
我看到这篇文章暗示了一些类似的想法,但它没有完全回答我的问题。
我正在使用Julia 1.2。这是我的测试:
a = rand(1000, 1000)
b = adjoint(a)
c = copy(b)
@btime a * x setup=(x=rand(1000)) # 114.757 ?s
@btime b * x setup=(x=rand(1000)) # 94.179 ?s
@btime c * x setup=(x=rand(1000)) # 110.325 ?s
Run Code Online (Sandbox Code Playgroud)
我期望a和c至少不会变慢。
在检查了stdlib / LinearAlgebra / src / matmul.jl之后,发现朱莉娅将b.parent(即a)传递给BLAS.gemv,而不是b,而是将LAPACK的dgemv_切换到了另一个明显更快的模式。
我是否假设加速是由于以下事实而进行的,即当内存处于trans = T模式时,无论dgemv_做什么,内存都以更有利的方式对齐?如果是这样,那么我猜想这是不可行的,除了可能以某种方式在文档中提到陷阱。如果我的假设是错误的,那么对此有什么办法要做?
我一直在尝试绘制一个简单的函数:
v(x, y) = (y*t, 2*x*t)
Run Code Online (Sandbox Code Playgroud)
(实际执行:v(x::Point2{T}, t) where T = Point2{T}(one(T) * x[2] * t, 4 * x[1]))
使用Makie的2D流图功能。
虽然我可以分别绘制每个时间步长,但是通过创建一个匿名函数f = x -> v(x, 5e0)(例如)并绘制f,当我尝试将其包装到Observable中(使用Node(f))时,我再也无法更新该Observable指向另一个函数,因此我的记录循环失败。
我尝试将Node的类型强制为更抽象(Node{Function})。不幸的是,这种抽象类型似乎丢失在Makie内部的某个地方,因此丢失了。
有什么办法可以包装我的类型,以免遇到类型冲突,但仍然是Function?
我在某人代码中看到他们正在使用+运算符,就好像它是函数doing一样+(1,2,3)。是否可以在Julia中将运算符用作函数?
此外,我还看到了类似的内容A ? B,其中的行为?是可自定义的。我该怎么做,是否有可用这种方式使用的符号列表?