I’m trying to follow along with @stevengj’s lecture notes on 2D differentiation matrices, but I can’t get past the first example without Julia reporting a stack-overflow error. The piece of code in question is

```
# construct the (M+1)xM matrix D, not including the 1/dx factor
diff1(M) = [ [1.0 zeros(1,M-1)]; diagm(ones(M-1),1) - eye(M) ]
diff1(5)
```

which on my machine results in

```
ERROR: StackOverflowError:
Stacktrace:
[1] diagm(::Vector{Float64}, ::Int64) (repeats 79984 times)
@ ChainRulesCore ~/.julia/packages/ChainRulesCore/8vlYQ/src/tangent_types/thunks.jl:66
```

Any ideas what could be the problem here? I’m using the 1.6.3 generic binary for 64-bit Linux.

Those notes are from quite an old version of Julia (0.4) — that’s not how the `diagm`

function is called anymore. An updated version of that function would be simply:

```
using LinearAlgebra
diff1(M) = let o = ones(M); diagm(M+1, M, 0=>o, -1=>-o); end
```

(And here is a sparse version using `spdiagm`

.)

2 Likes

A separate problem is that ChainRulesCore is engaging in “type piracy” of the `diagm`

function here, which is why you are getting a mysterious error message (instead of a `MethodError`

, which would be more sensible) here. This should be fixed in ChainRulesCore.jl: https://github.com/JuliaDiff/ChainRulesCore.jl/issues/472

2 Likes

Thanks for the help, and for making these notes available!