国际象棋和文本文件操作
这是一个国际象棋的图像位置:
这是尽可能接近图像处理今天的博客会来。因为这篇文章是关于文本处理。
似乎很多在工程和科学计算任务涉及操纵文本文件中的数据。这个周末我有这样一个任务,尽管我必须承认,它与工程或科学无关。即便如此,我还以为这个任务将是一个很好的说明一些基本的文本处理技术。
我有一个文本文件,战术。pgn,这是一个国际象棋战术游戏的数据库。这里有2759到2784行从文件。
(事件”吗?”][网站“?”][日期”? ? ? ? ? ? ? ?”][圆”吗?”][白色“图211”][黑"][结果“*”][EventDate " 2006.05.20 "][沼泽“2 b1r3 / ppk4p / 8/2q2p2/2Br2n1/2QP2N1 / P4PPP / 6 k1 w - - 0 1”][设置“1”][SourceDate“2011.02.22”)
1。Rxc8 + Kxc8 2。Be6 + Kd8 3。Qxc5 *
(事件”吗?”][网站“?”][日期”? ? ? ? ? ? ? ?”][圆”吗?”][白色“图212”][黑"][结果“*”][沼泽“3 rr1k1 / p1p2ppp Q2b1q2/8/3Np3/4P3 / PP3PPP R1B2RK1 b - - 0 1”][设置“1”][SourceDate“2011.02.22”)
1……Bxh2 + 2。Kxh2 Qxa6 *
这些线存储两个下棋的位置。第一个是这个职位我上面显示的,用白色。你能找出白色胜利通过捕获主教c8和他的车吗?(如果你感兴趣的职位是如何编码的文本,看到维基百科文章Forsyth-Edwards符号或分。)
我想要洗牌在这个文件中随机的位置。没有国际象棋软件程序,我能做到这一点,所以我决定用MATLAB解决它。(有趣的事情在一个星期六的早晨,对吧?)
好吧,这是基本的过程:
- 整个文件读入MATLAB。
- 把数据分割成块,每一块的位置。
- 重新排列随机块。
- 写出重新排列块到一个新的文本文件。
有很多不同的方法可以做到这一点。这就是我了。
首先,读取整个文件。这个函数fileread只是机票。
字符= fileread (“tactics.pgn”);大小(字符)
ans = 1 106394
你可以看到,大约有106000个字符的文件。让我们把数据分割成线使用strsplit。
行= strsplit(字符,' \ n ')”;大小(线)
答1 = 4838
大约有4800行文本。但是有多少职位?我要找到每个职位的起点通过搜索字符串“事件”开始一条线。是时候正则表达式。
idx = regexp(线,“^[事件”);idx (1:15)
ans = [1] [] [] [] [] [] [] [] [] [] [] [1] [] [] []
这告诉我们,这个字符串是发现两次文件的第一个15行。idx是一个单元阵列,因此我将使用吗cellfun和找到识别所有行包含匹配的字符串。文件中的每一行是一个条目的开始为一个国际象棋的位置。
first_line =找到(~ cellfun (@isempty idx));first_line (1:3)
ans = 1 12 23
所以有位置开始1行,12日和23日。
接下来,我将做一个单元阵列,每个单元格包含一个位置的所有行。for循环的工作,我将添加一个“额外”价值first_line向量指向一个不存在的线刚刚过去的文件。
first_line结束(+ 1)=(行)+ 1长度;为k = 1:长度(first_line) 1位置{k} =线(first_line (k): first_line (k + 1) 1);结束
现在让我们看看我们。
大小(职位)
ans = 1 421
文件中有421个职位。例如:
位置{205}
ans = '[事件”吗?”][网站”?”][日期”? ? ? ? ? ? ? ?”][圆”吗?”)“(白色“图211”)“(黑色“贝恩”)“(结果“*”)“[EventDate“2006.05.20”)“(分“2 b1r3 / ppk4p / 8/2q2p2/2Br2n1/2QP2N1 / P4PPP / 6 k1 w - - 0 1”)“(设置“1”)“[SourceDate“2011.02.22”)“1。Rxc8 + Kxc8 2。Be6 + Kd8 3。Qxc5 *’
这是这篇文章的位置显示在顶部。
现在越来越接近尾声,。是时候重新排列位置。我这样做之前,我将洗牌随机数发生器。我只有这样做,如果我在一个新的MATLAB会话重复这些步骤,我一定会得到不同的结果。洗牌后使用随机数发生器rng,快速调用randperm随机附带的位置。
rng洗牌shuffled_positions =位置(randperm(长度(职位)));
我们来到最后一步:写出打乱位置提升到一个新的文件。
fid = fopen (“shuffled_tactics.pgn”,' w ');为k = 1:长度(shuffled_positions)位置= shuffled_positions {k};为p = 1:长度(位置)流(fid,“% s \ n”、位置{p});结束结束文件关闭(fid);
这是它!
阅读文本,操纵一些有用的方式,和写作结果出来,常见的计算任务使用一些基本的MATLAB函数来实现的。
评论
留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。