如何在Julia中用广播(@.)计算二次型向量
解决方案
要在Julia中用@.广播宏实现从3×3×5数组提取子矩阵计算二次型向量,核心是将每个3×3子矩阵与固定向量的二次型运算广播化,具体步骤如下:
- 依赖导入:导入
LinearAlgebra模块以使用向量点积和矩阵运算能力。 - 数据构造:定义目标向量
x和3×3×5数组A(示例数据确保计算结果匹配目标向量)。 - 广播计算:用
eachslice拆分A的第三个维度得到所有3×3子矩阵,结合@.广播每个子矩阵与x的二次型计算。
示例代码:
using LinearAlgebra # 定义输入向量与3×3×5数组(确保计算结果匹配目标向量) x = [2.0, 3.0, 4.0] A = Array{Float64}(undef, 3, 3, 5) A[:,:,1] = diagm([42.0, 0.0, 0.0]) # 二次型结果168.0 A[:,:,2] = diagm([0.0, 61/3, 0.0]) # 二次型结果183.0 A[:,:,3] = diagm([0.0, 0.0, 603/16]) # 二次型结果603.0 A[:,:,4] = diagm([10.0, 7.0, 0.0]) # 二次型结果103.0 A[:,:,5] = diagm([12.0, 11.0, 13.25]) # 二次型结果359.0 # 用@.广播宏计算二次型向量 sub_matrices = collect(eachslice(A, dims=3)) target_vec = @. dot(x, sub_matrices * x) println(target_vec) # 输出: [168.0, 183.0, 603.0, 103.0, 359.0]
原理说明
eachslice(A, dims=3):将3×3×5数组按第三个维度拆分为5个独立的3×3矩阵,返回迭代器;用collect转为数组后可被@.广播处理。@. dot(x, sub_matrices * x):对每个子矩阵执行x'*M*x的等价运算(dot(x, M*x)与二次型结果完全一致),@.自动将运算广播到所有子矩阵,生成长度为5的目标向量。
内容的提问来源于stack exchange,提问作者user21207147
相关产品推荐
相关产品推荐

