Julia:编写适配单索引与索引列表的矩阵通用赋值代码
Julia 通用索引赋值兼容方案
针对单个索引与索引数组的赋值兼容性问题,有几种简洁实用的解决方式:
方式一:统一转为数组索引,使用广播赋值
把单个索引包装成数组,这样无论输入是单个整数还是索引数组,都能统一用.=`完成赋值,无需分支判断:
# 封装通用赋值函数 function assign_indices!(mat, indices, col, val) # 将单个整数索引转为一维数组,数组索引保持原样 idx = indices isa Integer ? [indices] : indices mat[idx, col] .= val end # 测试单个索引场景 a = zeros(5, 3) assign_indices!(a, 3, 1, 5.0) println(a[:,1]) # 输出:[0.0, 0.0, 5.0, 0.0, 0.0] # 测试多个索引场景 assign_indices!(a, [1,2], 1, 2.0) println(a[:,1]) # 输出:[2.0, 2.0, 5.0, 0.0, 0.0]
方式二:根据索引类型分支处理
直接判断输入的索引类型,分别使用普通赋值和广播赋值:
function assign_indices!(mat, indices, col, val) if indices isa Integer mat[indices, col] = val else mat[indices, col] .= val end end # 测试单个索引 a = zeros(5, 3) assign_indices!(a, 2, 2, 3.0) println(a[:,2]) # 输出:[0.0, 3.0, 0.0, 0.0, 0.0] # 测试多个索引 assign_indices!(a, [4,5], 2, 1.0) println(a[:,2]) # 输出:[0.0, 3.0, 0.0, 1.0, 1.0]
方式三:利用Ref包装单个索引适配广播
在需要直接赋值的场景中,用Ref()包装单个索引,配合@.宏自动处理广播逻辑:
a = zeros(5,3) # 单个索引场景 indices = 3 @. a[Ref(indices), 1] = 4.0 println(a[:,1]) # 输出:[0.0, 0.0, 4.0, 0.0, 0.0] # 多个索引场景 indices = [1,2] @. a[indices,1] = 2.0 println(a[:,1]) # 输出:[2.0, 2.0, 4.0, 0.0, 0.0]
内容的提问来源于stack exchange,提问作者alagris
相关产品推荐
相关产品推荐

