史蒂夫与MATLAB图像处理

图像处理的概念、算法和MATLAB

国际象棋和文本文件操作

这是一个国际象棋的图像位置:

这是尽可能接近图像处理今天的博客会来。因为这篇文章是关于文本处理。

似乎很多在工程和科学计算任务涉及操纵文本文件中的数据。这个周末我有这样一个任务,尽管我必须承认,它与工程或科学无关。即便如此,我还以为这个任务将是一个很好的说明一些基本的文本处理技术。

我有一个文本文件,战术。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解决它。(有趣的事情在一个星期六的早晨,对吧?)

好吧,这是基本的过程:

  1. 整个文件读入MATLAB。
  2. 把数据分割成块,每一块的位置。
  3. 重新排列随机块。
  4. 写出重新排列块到一个新的文本文件。

有很多不同的方法可以做到这一点。这就是我了。

首先,读取整个文件。这个函数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函数来实现的。




发表与MATLAB®R2013b

|
  • 打印

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。