最近再考虑用Mathematica实现一些基本的机器学习功能。因为在初步接触到科学计算工具的时候,显然会发现Mathematica的语言更友好,至少详细的离线文档和中文的即时函数名显示已经让我觉得很好了。Matlab没怎么用过新版本的,不过似乎好像周围人用的都是英文版。。这就导致我下定决心,同为多功能的科学计算工具,一定要在Mathematica上实现Matlab上的,至少大部分功能。

然后问题出在了循环上。在执行代码的时候,卡在For循环这里只执行一遍。自己试了很久,发现跟之间建立的矩阵变量有关,只要一使用这些变量,不但只执行一遍,甚至还会修改循环变量的显示值。

大致代码:

data := {{x1, x2, x3, y}, ...}
dataX := data[[1;;3]]
dataY := data[[4]]

For[a = 1, a <= 10,
  dataX;
  Print[a];
  a += 1;
]

其中只有dataX的一行用于省略表示含有该数据输入的参数更新过程。很奇怪,在我用的时候(版本10.4),只要在循环里使用了dataX或者dataY的时候,循环只会执行一次,出来的结果也十分奇怪(不可描述),且输出a的值固定变为了10。包括自己debug和在某度上查找的结果,都无法解释这个问题。

然后我又来推销stackoverflow了: https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica

For循环语法:

For[循环变量初值,循环结束条件,循环体(分号分隔多语句)]

Do循环语法:

Do[循环体(分号分隔多语句),{循环变量名,初值,结束值(包含)}]

这里提到说,Mathematica里的For循环的循环变量的作用域是开放的,和传统的C/C++不一样,在外部也能调用。要达到相同的效果,需要使用Module函数将其声明为局部变量。然后就推荐了Do循环。Do循环有着类似于我们常用的C语言for循环的功能,以变量的初始值和结束值为条件,执行循环体,而且还可以直接支持多变量循环。相比于For循环,Do循环的循环变量是局部的。

然后就有了:

...
Do[
  dataX;
  Print[a],
  {a, 1, 10}
]

换了循环语句之后,似乎问题就解决了。。

标签: none

添加新评论