julia 中的这种 dct (FFTW.jl) 行为是否正常?

Is this dct (FFTW.jl) behavior in julia normal?

我正在尝试在 Julia 上做一些压缩感知练习,但我意识到单位矩阵的离散余弦变换(使用 FFTW.jl)看起来不像其他编程语言的结果(又名 Mathematica 和 Matlab)。

例如在 Julia

using Plots, FFTW, LinearAlgebra
n = 100
Psi = dct(Matrix(1.0I,n,n))
heatmap(Psi)

得到这个矩阵(本质上是一个带有一些噪声的单位矩阵)

但是在 Matlab 中

imagesc(dct(eye(100,100),'Type',2))

这是结果(符合预期)

终于在 Mathematica 中了

MatrixPlot[N[FourierDCTMatrix[100, 2]], PlotLegends -> Automatic]

returns这个

为什么 Julia 的行为如此不同? 这正常吗?

Matlab(我猜是 Mathematica)对矩阵中的每一列进行 dct。当输入为 two-dimensional 时,FFTW 执行二维 dct。 fft 也是如此。

如果要column-wise变换,可以指定维度:

Psi1 = dct(Matrix(1.0I,n,n), 1);  # along first dimension
heatmap(Psi1)

注意 y-axis 的方向与 Plots.jl 相对于 Matlab 相反。

(顺便说一句,你也可以只写 I(n)1.0I(n) 而不是 Matrix(1.0I,n,n)

这是 Julia 有别于其他语言的地方。它倾向于将矩阵视为矩阵,而不仅仅是向量的集合或一堆标量。例如 exp(M)log(M) 矩阵不按元素运算,但会根据其线性代数定义计算矩阵指数和矩阵对数。