Julia中如何编写匿名广播调用实现矩阵指定列加动态随机值
实现代码
符合所有约束要求的写法如下:
((x, col) -> col == 2 ? x + rand() : x + 1).(A, (axes(A, 2))')
逻辑说明
axes(A, 2)会获取矩阵A的列索引范围1:3,转置为(axes(A, 2))'后变成1行3列的行向量,和2行3列的A做广播时,每一列的所有元素都会匹配到对应列的索引值。- 匿名函数对每个传入的元素做判断:如果是第2列的元素,就加上一个新生成的随机数,其他列的元素统一加1,刚好满足第二列每个元素加不同随机数、其余列加1的需求。
- 完全符合你提出的三个约束:
- 不会修改原矩阵A,只会返回新的计算结果,符合数据透明要求
- 没有定义任何额外的辅助变量,运行前后环境里只有A存在
- 直接使用匿名函数做广播调用,没有提前定义命名函数f
运行验证示例
假设你的A是示例中的矩阵:
julia> A = [0.705942 0.553562 0.731246; 0.205833 0.106978 0.131893] 2×3 Matrix{Float64}: 0.705942 0.553562 0.731246 0.205833 0.106978 0.131893 julia> ((x, col) -> col == 2 ? x + rand() : x + 1).(A, (axes(A, 2))') 2×3 Matrix{Float64}: 1.70594 1.03015 1.73125 1.20583 0.23479 1.13189
可以看到第二列两个元素分别加了不同的随机数,其余列都加了1,符合预期。
内容的提问来源于stack exchange,提问作者BuddhiLW
相关产品推荐
相关产品推荐

