Julia中矩阵与向量高效叉积实现及N行矩阵通用方法
符合Julianic风格的高效实现方案
方法一:矩阵乘法(BLAS优化,适配大规模矩阵)
叉乘cross(a, v)可转化为行向量a与向量v的反对称矩阵的乘积,这种方式依托BLAS优化,性能最优,适合处理大尺寸矩阵。
# 生成3维向量的反对称矩阵 function antisymmetric(v::AbstractVector) @assert length(v) == 3 "仅支持3维向量的反对称矩阵构造" return [0. -v[3] v[2]; v[3] 0. -v[1]; -v[2] v[1] 0.] end # 输入示例 A = [1. 2. 3.; 4. 5. 6.] v = [0.1, 0.2, 0.4] # 计算结果 result = A * antisymmetric(v)
运行后得到的结果矩阵为:
2×3 Matrix{Float64}: 0.2 -0.1 0.0 0.8 -1.0 0.3
(注:原提问中的预期结果第二列数值存在笔误,正确结果应为-1.0)
方法二:迭代器堆叠(代码简洁,适配中小规模矩阵)
通过eachrow遍历矩阵行,结合广播和堆叠操作实现,代码更直观:
# 输入示例 A = [1. 2. 3.; 4. 5. 6.] v = [0.1, 0.2, 0.4] # Julia 1.9+ 推荐写法 result = stack(cross(row, v) for row in eachrow(A))' # 兼容旧版本Julia的写法 result = reduce(vcat, transpose.(cross.(eachrow(A), Ref(v))))
推广到N行矩阵
两种方案均天然支持任意行数N的3列矩阵A:
- 矩阵乘法方案:只要A是
N×3维度,A * antisymmetric(v)会直接输出N×3的结果矩阵,每行对应原矩阵行与v的叉乘结果。 - 迭代器堆叠方案:
eachrow(A)会遍历所有N行,最终自动堆叠为N×3的结果矩阵。
前提条件:矩阵A必须为3列(每行是3维向量),向量v必须为3维,这是叉乘cross的固有要求。
内容的提问来源于stack exchange,提问作者CrisPlusPlus
相关产品推荐
相关产品推荐

