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)
矩阵不按元素运算,但会根据其线性代数定义计算矩阵指数和矩阵对数。
我正在尝试在 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)
矩阵不按元素运算,但会根据其线性代数定义计算矩阵指数和矩阵对数。