Code Planet

为了发现更大的世界


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

策略模式

发表于 2015-03-27 | 更新于 2015-08-15 | 分类于 未分类
出行旅游:我们可以有几个策略可以考虑:可以骑自行车,汽车,做火车,飞机。每个策略都可以得到相同的结果,但是它们使用了不同的资源。选择策略的依据是费用,时间,使用工具还有每种方式的方便程度 。
![](http://codeplanet-wordpress.stor.sinaapp.com/uploads/2015/03/wpid-a043baafeae17dec458e0f1095af6d04_47093040-ee28-4190-aa79-dbb649da36e4.png)
阅读全文 »

荷兰国旗问题

发表于 2015-03-12 | 更新于 2015-08-15 | 分类于 algorithms

1.题目描述

现有红白蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。这个问题之所以叫</span>荷兰国旗</span>,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。</span>如下图所示:</span></span>

2.问题分析:

这个问题我们可以将这个问题视为一个数组排序问题,这个数组分为前部,中部和后部三个部分,每一个元素(红白蓝分别对应0、1、2)必属于其中之一。由于红、白、蓝三色小球数量并不一定相同,所以这个三个区域不一定是等分的,也就是说如果我们将整个区域放在[0,1]的区域里,由于三色小球之间数量的比不同(此处假设1:2:2),可能前部为[0,0.2),中部为[0.2,0.6),后部为[0.6,1]。我们的思路如下:将前部和后部各排在数组的前边和后边,中部自然就排好了。具体的:
设置两个标志位begin和end分别指向这个数组的开始和末尾,然后用一个标志位current从头开始进行遍历:
1)若遍历到的位置为0,则说明它一定属于前部,于是就和begin位置进行交换,然后current向前进,begin也向前进(表示前边的已经都排好了)。
2)若遍历到的位置为1,则说明它一定属于中部,根据总思路,中部的我们都不动,然后current向前进。
3)若遍历到的位置为2,则说明它一定属于后部,于是就和end位置进行交换,由于交换完毕后current指向的可能是属于前部的,若此时current前进则会导致该位置不能被交换到前部,所以此时current不前进。而同1),end向后退1。
阅读全文 »

A*寻路算法入门

发表于 2015-03-11 | 更新于 2015-08-15 | 分类于 algorithms
**序:搜索区域**
假设有人想从A点移动到一墙之隔的B点,如下图,绿色的是起点A,红色是终点B,蓝色方块是中间的墙。
![](http://codeplanet-wordpress.stor.sinaapp.com/uploads/2015/03/wpid-3e3e252612c906a8a13ad2841325b750_52b63ab3-ce45-417b-84fe-3638d0346774.jpg)
[图-1]
你首先注意到,搜索区域被我们划分成了方形网格。像这样,简化搜索区域,是寻路的第一步。这一方法把搜索区域简化成了一个二维数组。数组的每一个元素是网格的一个方块,方块被标记为可通过的和不可通过的。路径被描述为从A到B我们经过的方块的集合。一旦路径被找到,我们的人就从一个方格的中心走向另一个,直到到达目的地。
这些中点被称为“节点”。当你阅读其他的寻路资料时,你将经常会看到人们讨论节点。为什么不把他们描述为方格呢?因为有可能你的路径被分割成其他不是方格的结构。他们完全可以是矩形,六角形,或者其他任意形状。节点能够被放置在形状的任意位置-可以在中心,或者沿着边界,或其他什么地方。我们使用这种系统,无论如何,因为它是最简单的。
**开始搜索**
正如我们处理上图网格的方法,一旦搜索区域被转化为容易处理的节点,下一步就是去引导一次找到最短路径的搜索。在A*寻路算法中,我们通过从点A开始,检查相邻方格的方式,向外扩展直到找到目标。
我们做如下操作开始搜索:
1,从点A开始,并且把它作为待处理点存入一个“开启列表”。开启列表就像一张购物清单。尽管现在列表里只有一个元素,但以后就会多起来。你的路径可能会通过它包含的方格,也可能不会。基本上,这是一个待检查方格的列表。
2,寻找起点周围所有可到达或者可通过的方格,跳过有墙,水,或其他无法通过地形的方格。也把他们加入开启列表。为所有这些方格保存点A作为“父方格”。当我们想描述路径的时候,父方格的资料是十分重要的。后面会解释它的具体用途。
3,从开启列表中删除点A,把它加入到一个“关闭列表”,列表中保存所有不需要再次检查的方格。在这一点,你应该形成如图的结构。在图中,暗绿色方格是你起始方格的中心。它被用浅蓝色描边,以表示它被加入到关闭列表中了。所有的相邻格现在都在开启列表中,它们被用浅绿色描边。每个方格都有一个灰色指针反指他们的父方格,也就是开始的方格。
![](http://codeplanet-wordpress.stor.sinaapp.com/uploads/2015/03/wpid-3e3e252612c906a8a13ad2841325b750_8c2dec0b-bd6d-4961-9037-47532f839ee6.jpg)
[图-2]
接着,我们选择开启列表中的临近方格,大致重复前面的过程,如下。但是,哪个方格是我们要选择的呢?是那个F值最低的。
路径评分
选择路径中经过哪个方格的关键是下面这个等式:F = G + H
这里:
* G = 从起点A,沿着产生的路径,移动到网格上指定方格的移动耗费。
* H = 从网格上那个方格移动到终点B的预估移动耗费。这经常被称为启发式的,可能会让你有点迷惑。这样叫的原因是因为它只是个猜测。我们没办法事先知道路径的长度,因为路上可能存在各种障碍(墙,水,等等)。虽然本文只提供了一种计算H的方法,但是你可以在网上找到很多其他的方法。
我们的路径是通过反复遍历开启列表并且选择具有最低F值的方格来生成的。文章将对这个过程做更详细的描述。首先,我们更深入的看看如何计算这个方程。
正如上面所说,G表示沿路径从起点到当前点的移动耗费。在这个例子里,我们令水平或者垂直移动的耗费为,对角线方向耗费为。我们取这些值是因为沿对角线的距离是沿水平或垂直移动耗费的的根号(别怕),或者约.414倍。为了简化,我们用和近似。比例基本正确,同时我们避免了求根运算和小数。这不是只因为我们怕麻烦或者不喜欢数学。使用这样的整数对计算机来说也更快捷。你不就就会发现,如果你不使用这些简化方法,寻路会变得很慢。
既然我们在计算沿特定路径通往某个方格的G值,求值的方法就是取它父节点的G值,然后依照它相对父节点是对角线方向或者直角方向(非对角线),分别增加和。例子中这个方法的需求会变得更多,因为我们从起点方格以外获取了不止一个方格。
H值可以用不同的方法估算。我们这里使用的方法被称为曼哈顿方法,它计算从当前格到目的格之间水平和垂直的方格的数量总和,忽略对角线方向,然后把结果乘以10。这被称为曼哈顿方法是因为它看起来像计算城市中从一个地方到另外一个地方的街区数,在那里你不能沿对角线方向穿过街区。很重要的一点,我们忽略了一切障碍物。这是对剩余距离的一个估算,而非实际值,这也是这一方法被称为启发式的原因。想知道更多?你可以在这里找到方程和额外的注解。
F的值是G和H的和。第一步搜索的结果可以在下面的图表中看到。F,G和H的评分被写在每个方格里。正如在紧挨起始格右侧的方格所表示的,F被打印在左上角,G在左下角,H则在右下角。
![](http://codeplanet-wordpress.stor.sinaapp.com/uploads/2015/03/wpid-3e3e252612c906a8a13ad2841325b750_39ff78ef-a66c-42a4-af1d-668ef146dc6b.jpg)
[图-3]
现在我们来看看这些方格。写字母的方格里,G = 10。这是因为它只在水平方向偏离起始格一个格距。紧邻起始格的上方,下方和左边的方格的G值都等于10。对角线方向的G值是14。
阅读全文 »

关于SQL语句中SUM函数返回NULL的解决办法

发表于 2015-01-21 | 更新于 2015-08-15 | 分类于 未分类
SUM是SQL语句中的标准求和函数,如果没有符合条件的记录,那么SUM函数会返回NULL。
但多数情况下,我们希望如果没有符合条件记录的情况下,我们希望它返回0,而不是NULL,那么我们可以使用例如下面的方法来处理: 
 

1.  `select isnull(sum(cost),0) from table_name;`
使用isnull()方法进行判断,如isnull(sum(cnt),0),其中0为默认值,如果sum(cnt)的结果为null,则赋值 0;同理此方法可用于某字段,isnull(cnt,0),这样就可以排除一些值为null的数值型字段了。而如果这样 isnull(sum(isnull(cnt,0)),0),这样就可保万无一失了。
** **
**注意:**在sqlite中没有isnull函数,而是使用ifnull函数,用法跟isnull一样
 
[来自为知笔记(Wiz)](http://www.wiz.cn/i/c09d0bb5 "来自为知笔记(Wiz)")

K-Means Clustering in OpenCV

发表于 2015-01-14 | 更新于 2015-08-15 | 分类于 未分类

cv2.kmeans()</span> </span>

### Input parameters[](http://docs.opencv.org/trunk/doc/py_tutorials/py_ml/py_kmeans/py_kmeans_opencv/py_kmeans_opencv.html#input-parameters "Permalink to this headline") > 1. **samples** : It should be of **np.float32** data type, and each feature should be put in a single column. > > 2. **nclusters(K)** : Number of clusters required at end > > 3.
**criteria** : It is the iteration termination criteria. When this criteria is satisfied, algorithm iteration stops. Actually, it should be a tuple of 3 parameters. They are ( type, max_iter, epsilon ):
> > *
3.a - type of termination criteria : It has 3 flags as below:
> > **cv2.TERM_CRITERIA_EPS** - stop the algorithm iteration if specified accuracy, _epsilon_, is reached. **cv2.TERM_CRITERIA_MAX_ITER** - stop the algorithm after the specified number of iterations, _max_iter_. **cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER** - stop the iteration when any of the above condition is met. >
> * 3.b - max_iter - An integer specifying maximum number of iterations. > > * 3.c - epsilon - Required accuracy
> 4. **attempts** : Flag to specify the number of times the algorithm is executed using different initial labellings. The algorithm returns the labels that yield the best compactness. This compactness is returned as output. > > 5. **flags** : This flag is used to specify how initial centers are taken. Normally two flags are used for this :**cv2.KMEANS_PP_CENTERS** and **cv2.KMEANS_RANDOM_CENTERS**.
### Output parameters[](http://docs.opencv.org/trunk/doc/py_tutorials/py_ml/py_kmeans/py_kmeans_opencv/py_kmeans_opencv.html#output-parameters "Permalink to this headline") > 1. **compactness** : It is the sum of squared distance from each point to their corresponding centers. > 2. **labels** : This is the label array (same as ‘code’ in previous article) where each element marked ‘0’, ‘1’..... > 3. **centers** : This is array of centers of clusters.
示例:

1.  `import numpy as np`
2.  `import cv2`
3.  `from matplotlib import pyplot as plt`
4.5.  `X = np.random.randint(25,50,(25,2))`
6.  `Y = np.random.randint(60,85,(25,2))`
7.  `Z = np.vstack((X,Y))`
8.9.  `# convert to np.float32`
10.  `Z = np.float32(Z)`
11.12.  `# define criteria and apply kmeans()`
13.  `criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)`
14.  `ret,label,center=cv2.kmeans(Z,2,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)`
15.16.  `# Now separate the data, Note the flatten()`
17.  `A = Z[label.ravel()==0]`
18.  `B = Z[label.ravel()==1]`
19.20.  `# Plot the data`
21.  `plt.scatter(A[:,0],A[:,1])`
22.  `plt.scatter(B[:,0],B[:,1],c = 'r')`
23.  `plt.scatter(center[:,0],center[:,1],s = 80,c = 'y', marker = 's')`
24.  `plt.xlabel('Height'),plt.ylabel('Weight')`
25.  `plt.show()`
![](http://codeplanet-wordpress.stor.sinaapp.com/uploads/2015/01/wpid-d2ab590efc92b80dda0dbf8a3363cb77_f29be1bf-f12c-4f1e-b005-cfaf99fe5156.png)
[来自为知笔记(Wiz)](http://www.wiz.cn/i/c09d0bb5 "来自为知笔记(Wiz)")

Eigen计算特征向量与特征值

发表于 2014-11-25 | 更新于 2015-08-15 | 分类于 未分类

1.构建Matrix


1.  `    Matrix4f A;`
2.  `    A << 1,0,0,0,`
3.  `         0,1,0,0,`
4.  `         0,0,1,0,`
5.  `         0,0,0,1;`
2.计算特征值,特征向量

1.  `    EigenSolver<Matrix4f> es(A);`
2.  `    `
3.  `    //输ê?出3?矩?阵ó`
4.  `    cout << "矩?阵óA:" << endl << A << endl << endl;`
5.  `    `
6.  `    //特ì?征÷值μ`
7.  `    cout << "特ì?征÷值μ:£o" << endl << es.eigenvalues() << endl << endl;`
8.  `    //特ì?征÷向ò量á?`
9.  `    cout << "特ì?征÷向ò量á?:£o" << endl;`
10.  `    cout << "The 1st eigenvector of the matrix is:" `
11.  `        << endl << "["<< es.eigenvectors().col(0).transpose() <<  "]"<<endl;`
12.  `    cout << "The 2nd eigenvector of the matrix is:" `
13.  `        << endl << "["<< es.eigenvectors().col(1).transpose() <<  "]"<< endl;`
14.  `    cout << "The 3rd eigenvector of the matrix is:" `
15.  `        << endl << "["<< es.eigenvectors().col(2).transpose() <<  "]" << endl;`
16.  `    cout << "The 4th eigenvector of the matrix is:" `
17.  `        << endl << "["<< es.eigenvectors().col(3).transpose() <<  "]" << endl;`
3.至此输出的特征值特征向量都为复数形式。通过查看文档了解到Eigen中复数采用的数据结构是std::complex

1.  `    cout << es.eigenvalues()(0).real() << endl;`
2.  `    cout << es.eigenvalues()(1).real() << endl;`
3.  `    cout << es.eigenvalues()(2).real() << endl;`
4.  `    cout << es.eigenvalues()(3).real() << endl;`
输出:

1.  `矩阵A:`
2.  `1 0 0 0`
3.  `0 1 0 0`
4.  `0 0 1 0`
5.  `0 0 0 1`
6.7.  `特征值:`
8.  `(1,0)`
9.  `(1,0)`
10.  `(1,0)`
11.  `(1,0)`
12.13.  `特征向量:`
14.  `The 1st eigenvector of the matrix is:`
15.  `[(1,0) (0,0) (0,0) (0,0)]`
16.  `The 2nd eigenvector of the matrix is:`
17.  `[(0,0) (1,0) (0,0) (0,0)]`
18.  `The 3rd eigenvector of the matrix is:`
19.  `[(0,0) (0,0) (1,0) (0,0)]`
20.  `The 4th eigenvector of the matrix is:`
21.  `[(0,0) (0,0) (0,0) (1,0)]`
22.23.  `提取特征值(实部)`
24.  `1`
25.  `1`
26.  `1`
27.  `1`
28.  `0.021s`
29.  `请按任意键继续. . .`
[来自为知笔记(Wiz)](http://www.wiz.cn/i/c09d0bb5 "来自为知笔记(Wiz)")

Copy vtkImageData to cv::Mat

发表于 2014-10-11 | 更新于 2015-08-15 | 分类于 vtk
opencv无法读取dicom图像,就想到把vtkImageData转成cv::Mat进行处理。
废话不多说,上代码
`
    //convert vtkimagedata to cv::mat     vtkSmartPointer<vtkImageData> imageData_1 = reader->GetOutput();     vtkSmartPointer<vtkExtractVOI> extractVOI =vtkSmartPointer<vtkExtractVOI>::New() ;     extractVOI->SetInput(imageData_1);     **int** dims[3];     imageData_1->GetDimensions(dims);     cout << dims[0]<< endl;     cout << dims[1]<< endl;     cout << dims[2]<< endl;     extractVOI->SetVOI(0, dims[0], 0, dims[1], 0, 0); // Set it to z=75     extractVOI->GetOutput()->SetScalarTypeToSignedChar();     cv::Mat image(dims[0], dims[1], CV_8UC1);     extractVOI->Update();     **for** (**int** i=0; i<dims[0]; ++i)      {         **for** (**int** j=0; j<dims[1]; ++j)          {             image.at<**unsigned** **char**>(cv::Point(j,i)) =                  ***static_cast**<**unsigned** **char***>(extractVOI->GetOutput()->GetScalarPointer(i,j,0));         }     }
`
参考:http://stackoverflow.com/questions/19891341/copy-vtkimagedata-to-cvmat
[来自为知笔记(Wiz)](http://www.wiz.cn/i/c09d0bb5 "来自为知笔记(Wiz)")

解决Grayscale图像无法跟RGB图像Blend问题

发表于 2014-09-25 | 更新于 2015-08-15 | 分类于 vtk

当使用Grayscale图像跟RGB图像进行blend的时候,使用vtkImageBlend滤波器,但是这个filter规定了只能进行Grayscale之间或者RGB之间的blend。

当我使用Grayscale图像无法跟RGB图像会遇到error:
`
ERROR: In ..\..\src\Imaging\vtkImageBlend.cxx, line 903 vtkImageBlend (0000000003B47450): input has too many components, can't blend RGB data                        into greyscale data
</div></div></div><div>解决的思路当然是把灰度图像转换为rgb图像,但是不用映射lookuptable,如果映射了lookuptable,灰色图像将映射到红色至蓝色之间的颜色。</div><div>具体工作代码如下:</div><div><div>
    vtkSmartPointer<vtkScalarsToColors> scalarsToColors =  vtkSmartPointer<vtkScalarsToColors>::New();       vtkSmartPointer<vtkImageMapToColors> colorMapper = vtkSmartPointer<vtkImageMapToColors>::New();     colorMapper->SetOutputFormatToRGB();     colorMapper->SetInput(reader->GetOutput());     colorMapper->SetLookupTable( scalarsToColors );
</div>`</div></div>
参考:http://vtk.1045678.n5.nabble.com/Convert-grayscale-image-to-rgb-td5727289.html#

[来自为知笔记(Wiz)](http://www.wiz.cn/i/c09d0bb5 "来自为知笔记(Wiz)")

UnicodeDecodeError

发表于 2014-09-24 | 更新于 2015-08-15 | 分类于 python
[来自为知笔记(Wiz)](http://www.wiz.cn/i/c09d0bb5 "来自为知笔记(Wiz)")

486

发表于 2014-09-22 | 更新于 2015-08-15 | 分类于 未分类

傻逼的IndentationError错误。http://www.crifan.com/python_syntax_error_indentationerror/comment-page-1/

1…567…12
Lu Xiaohua

Lu Xiaohua

116 日志
33 分类
86 标签
GitHub E-Mail
© 2019 Lu Xiaohua
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Muse v7.0.0