a[[b]]中双方括号的含义
mathematica吧
全部回复
仅看楼主
level 11
Fetchens 楼主
以下是Mathematica 8.0.4帮助文档中讲Range的页面,其中inverse[[perm]]这里双方括号是什么意思没有看懂,请哪位大神来解释解释~ 因为这里inverse、perm都不是内置函数,而且已经被赋值为一组数,所以顺便也说说一个方括号在这种情况下是什么意思。
求逆排列:
In[1]:= perm = RandomSample[Range[10]]
Out[1]= {4, 2, 8, 1, 10, 5, 3, 6, 9, 7}
In[2]:= inverse = perm;
inverse[[perm]] = Range[Length[perm]];
inverse
Out[2]= {4, 2, 7, 1, 6, 8, 10, 3, 9, 5}
2019年04月28日 09点04分 1
level 12
双方括号 [[ ]] 的功能与 Part 函数一样,功能是提取列表指定位置的元素。例如,{a, b, c, d, e, f, g}[[{2, 4, 5}]],表示提取{a, b, c, d, e, f, g}这个列表的第2、第4、第5个元素,最终给出新列表 {b, d, e}。
下面解释你给出的例子。
---以下是你的代码(简称“代1”)--
In[1]:= perm = RandomSample[Range[10]]
Out[1]= {4, 2, 8, 1, 10, 5, 3, 6, 9, 7}
In[2]:= inverse = perm;
---以上是你的代码(简称“代1”)--
解释:通过“代1”,得到两个变量,分别是
perm = {4, 2, 8, 1, 10, 5, 3, 6, 9, 7}
inverse = {4, 2, 8, 1, 10, 5, 3, 6, 9, 7} (注:对于 inverse[[perm]] = Range[Length[perm]] 的结果,这里 inverse 列表的具体内容并不重要,详细解释见下文。)
再分析 inverse[[perm]] = Range[Length[perm]]:
1. Length[perm] 给出 perm 的元素数量,结果为 10;
2. Range[Length[perm]] 即 Range[10],结果为
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
3. inverse[[perm]] 表示用 perm 中的序号提取 inverse 中对应位置的元素(参考我在第一段给出的例子),具体表达式为 inverse[[{4, 2, 8, 1, 10, 5, 3, 6, 9, 7}]]。例如,inverse[[4]],表示提取 inverse 第 4 个位置的元素。
4. 最后将整个等式结合起来看:
(1) Range[Length[perm]]的第一个元素是 1,而 inverse[[perm]] 的第一个元素是 inverse[[4]],将两者结合起来就是 inverse[[4]] = 1,意思就是将 1 赋值到 inverse 的第四个位置(并覆盖掉这个位置上原有的数值),即得到 {x, x, x, 1, x, x, x, x, x, x}(注:用 x 表示inverse 的原有值)。
(2) 以此类推,我们再分析 Range[Length[perm]]的第二个元素 2,以及 inverse[[perm]] 的第二个元素 inverse[[2]],将两者结合起来就是 inverse[[2]] = 2,意思是将 2 赋值到 inverse 的第二个位置(并覆盖掉这个位置上原有的数值),即得到 {x, 2, x, 1, x, x, x, x, x, x}(注:用 x 表示inverse 的原有值)。
(3) Range[Length[perm]]的第三个元素是 3,inverse[[perm]] 的第三个元素是 inverse[[8]],将两者结合起来就是 inverse[[8]] = 3,意思是将 3 赋值到 inverse 的第八个位置(并覆盖掉这个位置上原有的数值),即得到 {x, 2, x, 1, x, x, x, 3, x, x}(注:用 x 表示inverse 的原有值)。
(4) Range[Length[perm]]的第四个元素是 4,inverse[[perm]] 的第四个元素是 inverse[[1]],将两者结合起来就是 inverse[[1]] = 4,意思是将 4 赋值到 inverse 的第一个位置(并覆盖掉这个位置上原有的数值),即得到 {4, 2, x, 1, x, x, x, 3, x, x}(注:用 x 表示inverse 的原有值)。
(5) Range[Length[perm]]的第五个元素是 5,inverse[[perm]] 的第五个元素是 inverse[[10]],将两者结合起来就是 inverse[[10]] = 5,意思是将 4 赋值到 inverse 的第一个位置(并覆盖掉这个位置上原有的数值),即得到 {4, 2, x, 1, x, x, x, 3, x, 5}(注:用 x 表示inverse 的原有值)。
(6) Range[Length[perm]]的第六个元素是 6,inverse[[perm]] 的第六个元素是 inverse[[5]],将两者结合起来就是 inverse[[5]] = 6,意思是将 6 赋值到 inverse 的第五个位置(并覆盖掉这个位置上原有的数值),即得到 {4, 2, x, 1, 6, x, x, 3, x, 5}(注:用 x 表示inverse 的原有值)。
(7) Range[Length[perm]]的第七个元素是 7,inverse[[perm]] 的第七个元素是 inverse[[3]],将两者结合起来就是 inverse[[3]] = 7,意思是将 7 赋值到 inverse 的第三个位置(并覆盖掉这个位置上原有的数值),即得到 {4, 2, 7, 1, 6, x, x, 3, x, 5}(注:用 x 表示inverse 的原有值)。
(8) Range[Length[perm]]的第八个元素是 8,inverse[[perm]] 的第八个元素是 inverse[[6]],将两者结合起来就是 inverse[[6]] = 8,意思是将 8 赋值到 inverse 的第六个位置(并覆盖掉这个位置上原有的数值),即得到 {4, 2, 7, 1, 6, 8, x, 3, x, 5}(注:用 x 表示inverse 的原有值)。
(9) Range[Length[perm]]的第九个元素是 9,inverse[[perm]] 的第九个元素是 inverse[[9]],将两者结合起来就是 inverse[[9]] = 9,意思是将 8 赋值到 inverse 的第六个位置(并覆盖掉这个位置上原有的数值),即得到 {4, 2, 7, 1, 6, 8, x, 3, 9, 5}(注:用 x 表示inverse 的原有值)。
(10) Range[Length[perm]]的第十个元素是 10,inverse[[perm]] 的第十个元素是 inverse[[7]],将两者结合起来就是 inverse[[7]] = 10,意思是将 10 赋值到 inverse 的第七个位置(并覆盖掉这个位置上原有的数值),即得到 {4, 2, 7, 1, 6, 8, 10, 3, 9, 5}(注:用 x 表示inverse 的原有值)。
解释结束。
2019年04月28日 17点04分 2
不是“双方括号 [[ ]] 的功能与 Part 函数一样”,而是[[]]本身就是Part的简写形式。
2019年05月04日 06点05分
@xzcyr 多谢指教。
2019年05月04日 07点05分
吧务
level 15
2019年05月04日 06点05分 3
level 11
Fetchens 楼主
谢谢大佬们指导~
2019年05月31日 09点05分 4
1