矩阵维度正确时Julia仍抛出矩阵乘法错误求助
问题分析与解决
核心问题是**rand(MvNormal, m, n)的用法错误**,导致生成了三维数组而非预期的二维样本矩阵,进而引发矩阵乘法维度不匹配。
错误原因
在Distributions包中,rand(d::MultivariateDistribution, n)的返回格式是**维度数 × 样本数的二维矩阵(每一列对应一个样本)。而你使用的rand(d, 1000, 2)会生成维度数 × 1000 × 2**的三维数组,这完全不是你需要的1000行2列的样本矩阵。
当你用1000×1000的投影矩阵Pz去乘这个三维数组时,矩阵乘法的维度要求(前一矩阵列数=后一矩阵行数)不满足,因此报错。而Y是标准的二维矩阵,所以Pz * Y能正常运行。
修复方案
将生成样本矩阵的代码修改为:通过rand(d, 样本数)生成维度数×样本数的矩阵,再转置得到样本数×维度数的矩阵(即每行一个样本)。
修改后的完整代码:
## packages using Random, Distributions, LinearAlgebra ## set seed Random.seed!(02192024); # generate the distribution for X μ = zeros(2); Σ = [1 0; 0 1]; d = MvNormal(μ, Σ); X = rand(d, 1000)'; # 修改:转置得到1000×2矩阵 # generate the distribution for Z μ = zeros(3); Σ = [1 0 0; 0 1 0; 0 0 1]; zd = MvNormal(μ, Σ); Z = rand(zd, 1000)'; # 修改:转置得到1000×3矩阵 # generate the distribution for Y Y = randn(1000, 1); # define the projection matrix Pz = Z * inv(Z'*Z) * Z'; # define X̂ and Ŷ X̂ = Pz * X; # 现在维度匹配,不会报错 Ŷ = Pz * Y;
额外说明
如果你不想用转置,也可以用permutedims(rand(d, 1000), (2, 1))替代转置操作,效果完全一致。
内容的提问来源于stack exchange,提问作者Wildcat PhD
相关产品推荐
相关产品推荐

