J语言中如何对选择器进行取反操作
问题解答
1. 选择器整体取反的实现方法
可以实现,你可以基于现有选择器构造补集索引,代码示例如下:
首先定义测试矩阵和你原来的选择器:
rarg=. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 mat =. 4 4 $ rarg orig_sel =. <(<0 1),(<0 1) NB. 你原有要取反的选择器
对选择器整体取反(选中所有不在orig_sel范围内的位置)的写法如下:
_1 (] -.@:e.&,/orig_sel)@:#:"0@i.@$ } mat
运行结果和你预期的完全一致:
0 1 _1 _1 4 5 _1 _1 _1 _1 _1 _1 _1 _1 _1 _1
该写法适配任意维度的矩阵,不需要硬编码行列数,只要修改orig_sel里的行列选择范围就可以通用。
2. 替换为自定义值的方法
直接替换语句最左侧的_1为你需要的自定义内容即可:
- 如果是统一替换为单个值,比如替换为99:
99 (] -.@:e.&,/orig_sel)@:#:"0@i.@$ } mat
- 如果需要给替换区域配置不同的自定义块,只要构造和替换区域维度匹配的数组作为左参数即可,比如要把替换区域的右上角2×2块改为
10 20/30 40,下方2行全部改为0:
replace_val =. (2 2 $ 10 20 30 40) , (2 4 $ 0) replace_val (] -.@:e.&,/orig_sel)@:#:"0@i.@$ } mat
内容的提问来源于stack exchange,提问作者paweljakubas
相关产品推荐
相关产品推荐

