﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-socketref,呆在autonavi.com-随笔分类-Math</title><link>http://www.cppblog.com/socketref/category/15438.html</link><description>gis,mouse,luolasi</description><language>zh-cn</language><lastBuildDate>Wed, 11 Jul 2012 23:22:44 GMT</lastBuildDate><pubDate>Wed, 11 Jul 2012 23:22:44 GMT</pubDate><ttl>60</ttl><item><title>python::代码学习</title><link>http://www.cppblog.com/socketref/archive/2012/07/10/182547.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Tue, 10 Jul 2012 02:04:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2012/07/10/182547.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/182547.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2012/07/10/182547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/182547.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/182547.html</trackback:ping><description><![CDATA[提高水平总是靠学习他人代码来的快 <br /><br />看看这个代码，摘录自gameobject<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">__init__</span><span style="color: #000000; ">(self,&nbsp;x</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0.,&nbsp;y</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0.):<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">"""</span><span style="color: #800000; ">Initialise&nbsp;a&nbsp;vector<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #800000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@type&nbsp;x:&nbsp;number<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@param&nbsp;x:&nbsp;The&nbsp;x&nbsp;value&nbsp;(defaults&nbsp;to&nbsp;0.),&nbsp;or&nbsp;a&nbsp;container&nbsp;of&nbsp;2&nbsp;values<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@type&nbsp;x:&nbsp;number<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@param&nbsp;y:&nbsp;The&nbsp;y&nbsp;value&nbsp;(defaults&nbsp;to&nbsp;0.)<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #800000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">"""</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;hasattr(x,&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">__getitem__</span><span style="color: #800000; ">"</span><span style="color: #000000; ">):<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x,&nbsp;y&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;x<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._v&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[float(x),&nbsp;float(y)]<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._v&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[float(x),&nbsp;float(y)]</span></div>挺好的，参数带入可以支持 a(1,2)形式，也可支持a( (1,2) )形式 ，非常灵活，自已以前总是想不到用hasattr来判断<br /><br /><br /><img src ="http://www.cppblog.com/socketref/aggbug/182547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2012-07-10 10:04 <a href="http://www.cppblog.com/socketref/archive/2012/07/10/182547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Gaussian elimination 高斯消元</title><link>http://www.cppblog.com/socketref/archive/2011/08/29/154575.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Sun, 28 Aug 2011 18:47:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2011/08/29/154575.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/154575.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2011/08/29/154575.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/154575.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/154575.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="font-family: serif, times; line-height: normal; background-color: #ffffff; font-size: medium; ">It can be used to solve linear equation systems or to invert a matrix.</span><br />高斯消元法用于解决线性代数求多元方程组的解，或者用于求可逆矩阵的逆<br />嘿嘿，python代码现成可用：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">def&nbsp;gauss_jordan(m</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;eps&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1.0</span><span style="color: #000000; ">/</span><span style="color: #000000; ">(</span><span style="color: #000000; ">10</span><span style="color: #000000; ">**</span><span style="color: #000000; ">10</span><span style="color: #000000; ">))</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #000000; ">"""</span><span style="color: #000000; ">Puts&nbsp;given&nbsp;matrix&nbsp;(2D&nbsp;array)&nbsp;into&nbsp;the&nbsp;Reduced&nbsp;Row&nbsp;Echelon&nbsp;Form.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Returns&nbsp;True&nbsp;if&nbsp;successful,&nbsp;False&nbsp;if&nbsp;'m'&nbsp;is&nbsp;singular.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOTE:&nbsp;make&nbsp;sure&nbsp;all&nbsp;the&nbsp;matrix&nbsp;items&nbsp;support&nbsp;fractions!&nbsp;Int&nbsp;matrix&nbsp;will&nbsp;NOT&nbsp;work!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Written&nbsp;by&nbsp;J.&nbsp;Elonen&nbsp;in&nbsp;April&nbsp;2005,&nbsp;released&nbsp;into&nbsp;Public&nbsp;Domain</span><span style="color: #000000; ">"""</span><span style="color: #000000; "><br />&nbsp;&nbsp;(h</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;w)&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(len(m)</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;len(m[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]))<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;y&nbsp;in&nbsp;</span><span style="color: #008080; ">range</span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">h)</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;maxrow&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;y<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;y2&nbsp;in&nbsp;</span><span style="color: #008080; ">range</span><span style="color: #000000; ">(y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;h)</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Find&nbsp;max&nbsp;pivot</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008080; ">abs</span><span style="color: #000000; ">(m[y2][y])&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008080; ">abs</span><span style="color: #000000; ">(m[maxrow][y])</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxrow&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;y2<br />&nbsp;&nbsp;&nbsp;&nbsp;(m[y]</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;m[maxrow])&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(m[maxrow]</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;m[y])<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008080; ">abs</span><span style="color: #000000; ">(m[y][y])&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;eps</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Singular?</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">False</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;y2&nbsp;in&nbsp;</span><span style="color: #008080; ">range</span><span style="color: #000000; ">(y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;h)</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Eliminate&nbsp;column&nbsp;y</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;m[y2][y]&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;m[y][y]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;x&nbsp;in&nbsp;</span><span style="color: #008080; ">range</span><span style="color: #000000; ">(y</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;w)</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m[y2][x]&nbsp;</span><span style="color: #000000; ">-=</span><span style="color: #000000; ">&nbsp;m[y][x]&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;c<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;y&nbsp;in&nbsp;</span><span style="color: #008080; ">range</span><span style="color: #000000; ">(h</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Backsubstitute</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;m[y][y]<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;y2&nbsp;in&nbsp;</span><span style="color: #008080; ">range</span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">y)</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;x&nbsp;in&nbsp;</span><span style="color: #008080; ">range</span><span style="color: #000000; ">(w</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;y</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m[y2][x]&nbsp;</span><span style="color: #000000; ">-=</span><span style="color: #000000; ">&nbsp;&nbsp;m[y][x]&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;m[y2][y]&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;c<br />&nbsp;&nbsp;&nbsp;&nbsp;m[y][y]&nbsp;</span><span style="color: #000000; ">/=</span><span style="color: #000000; ">&nbsp;c<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;x&nbsp;in&nbsp;</span><span style="color: #008080; ">range</span><span style="color: #000000; ">(h</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;w)</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Normalize&nbsp;row&nbsp;y</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m[y][x]&nbsp;</span><span style="color: #000000; ">/=</span><span style="color: #000000; ">&nbsp;c<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">True</span></div>使用方法 :<br /><br /><div><div>If your matrix is of form [A:x] (as is usual when solving systems), items of A and x both have to be divisible by items of A but not the other way around. Thus, you could, for example, use floats for A and vectors for x. Example:</div><div></div><div>mtx = [[1.0, 1.0, 1.0, Vec3(0.0, &nbsp;4.0, 2.0), 2.0],</div><div>&nbsp; &nbsp; &nbsp; &nbsp;[2.0, 1.0, 1.0, Vec3(1.0, &nbsp;7.0, 3.0), 3.0],</div><div>&nbsp; &nbsp; &nbsp; &nbsp;[1.0, 2.0, 1.0, Vec3(15.0, 2.0, 4.0), 4.0]]</div><div></div><div>if gauss_jordan(mtx):</div><div>&nbsp; print mtx</div><div>else:</div><div>&nbsp; print "Singular!"</div><div></div><div># Prints out (approximately):</div><div>#</div><div># [[1.0, 0.0, 0.0, ( &nbsp;1.0, &nbsp;3.0, &nbsp;1.0), &nbsp;1.0],</div><div># &nbsp;[0.0, 1.0, 0.0, ( 15.0, -2.0, &nbsp;2.0), &nbsp;2.0],</div><div># &nbsp;[0.0, 0.0, 1.0, (-16.0, &nbsp;3.0, -1.0), -1.0]]</div><div>Auxiliary functions contributed by Eric Atienza (also released in Public Domain):</div><div></div><div>def solve(M, b):</div><div>&nbsp; """</div><div>&nbsp; solves M*x = b</div><div>&nbsp; return vector x so that M*x = b</div><div>&nbsp; :param M: a matrix in the form of a list of list</div><div>&nbsp; :param b: a vector in the form of a simple list of scalars</div><div>&nbsp; """</div><div>&nbsp; m2 = [row[:]+[right] for row,right in zip(M,b) ]</div><div>&nbsp; return [row[-1] for row in m2] if gauss_jordan(m2) else None</div><div></div><div>def inv(M):</div><div>&nbsp; """</div><div>&nbsp; return the inv of the matrix M</div><div>&nbsp; """</div><div>&nbsp; #clone the matrix and append the identity matrix</div><div>&nbsp; # [int(i==j) for j in range_M] is nothing but the i(th row of the identity matrix</div><div>&nbsp; m2 = [row[:]+[int(i==j) for j in range(len(M) )] for i,row in enumerate(M) ]</div><div>&nbsp; # extract the appended matrix (kind of m2[m:,...]</div><div>&nbsp; return [row[len(M[0]):] for row in m2] if gauss_jordan(m2) else None</div><div></div><div>def zeros( s , zero=0):</div><div>&nbsp; &nbsp; """</div><div>&nbsp; &nbsp; return a matrix of size `size`</div><div>&nbsp; &nbsp; :param size: a tuple containing dimensions of the matrix</div><div>&nbsp; &nbsp; :param zero: the value to use to fill the matrix (by default it's zero )</div><div>&nbsp; &nbsp; """</div><div>&nbsp; &nbsp; return [zeros(s[1:] ) for i in range(s[0] ) ] if not len(s) else zero</div></div><br /><br /><br />算法伪代码:<br /><span class="Apple-style-span" style="font-size: 13px; background-color: #eeeeee; "><span style="color: #000000; ">i&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span></span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #000000; ">j&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(i&nbsp;&#8804;&nbsp;m&nbsp;and&nbsp;j&nbsp;&#8804;&nbsp;n)&nbsp;</span><span style="color: #0000FF; ">do</span><span style="color: #000000; "><br />&nbsp;&nbsp;Find&nbsp;pivot&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;column&nbsp;j,&nbsp;starting&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;row&nbsp;i:<br />&nbsp;&nbsp;maxi&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;k&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;to&nbsp;m&nbsp;</span><span style="color: #0000FF; ">do</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;abs(A[k,j])&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;abs(A[maxi,j])&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxi&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;k<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; "><br />&nbsp;&nbsp;end&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;A[maxi,j]&nbsp;&#8800;&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;swap&nbsp;rows&nbsp;i&nbsp;and&nbsp;maxi,&nbsp;but&nbsp;</span><span style="color: #0000FF; ">do</span><span style="color: #000000; ">&nbsp;not&nbsp;change&nbsp;the&nbsp;value&nbsp;of&nbsp;i<br />&nbsp;&nbsp;&nbsp;&nbsp;Now&nbsp;A[i,j]&nbsp;will&nbsp;contain&nbsp;the&nbsp;old&nbsp;value&nbsp;of&nbsp;A[maxi,j].<br />&nbsp;&nbsp;&nbsp;&nbsp;divide&nbsp;each&nbsp;entry&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;row&nbsp;i&nbsp;by&nbsp;A[i,j]<br />&nbsp;&nbsp;&nbsp;&nbsp;Now&nbsp;A[i,j]&nbsp;will&nbsp;have&nbsp;the&nbsp;value&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;u&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;to&nbsp;m&nbsp;</span><span style="color: #0000FF; ">do</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subtract&nbsp;A[u,j]&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;row&nbsp;i&nbsp;from&nbsp;row&nbsp;u<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Now&nbsp;A[u,j]&nbsp;will&nbsp;be&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;since&nbsp;A[u,j]&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;A[i,j]&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;A[u,j]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;A[u,j]&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;A[u,j]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">.<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; "><br />&nbsp;&nbsp;end&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; "><br />&nbsp;&nbsp;j&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;j&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; "><br />end&nbsp;</span><span style="color: #0000FF; ">while<br /><br /></span><span style="color: #000000; "><br /></span></div><img src ="http://www.cppblog.com/socketref/aggbug/154575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2011-08-29 02:47 <a href="http://www.cppblog.com/socketref/archive/2011/08/29/154575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计算矩阵的逆</title><link>http://www.cppblog.com/socketref/archive/2011/08/28/154530.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Sat, 27 Aug 2011 21:21:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2011/08/28/154530.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/154530.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2011/08/28/154530.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/154530.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/154530.html</trackback:ping><description><![CDATA[矩阵是个好玩的东西，在平面软件处理的时候，逆矩阵都用来转换鼠标位置到特定的坐标系,教科书是这么写的 &nbsp;M' x ( F x M) = M<br />numpy 就很简单了:&nbsp;<br /><br /><div>from numpy import linalg as LA<br />form numpy import *<br />m = mat('1 2 3;4 5 6;7 8 9')<br />mi = LA.inv(m)<br />print mi</div><img src ="http://www.cppblog.com/socketref/aggbug/154530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2011-08-28 05:21 <a href="http://www.cppblog.com/socketref/archive/2011/08/28/154530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Gis中的向量用法</title><link>http://www.cppblog.com/socketref/archive/2010/11/12/133434.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Fri, 12 Nov 2010 07:59:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/11/12/133434.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/133434.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/11/12/133434.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/133434.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/133434.html</trackback:ping><description><![CDATA[&nbsp;GIS中的计算几何<br><br><br>GIS是一个图形系统，必然会涉及到几何学的理论应用，比如，图形可视化，空间拓扑分析，GIS图形编辑等都需要用到几何<br><br>。向量几何是用代数的方法来研究几何问题，首先，请大家翻一翻高等数学里有关向量的章节，熟悉一下几个重要的概念：<br><br>向量、向量的模、向量的坐标表示、向量的加减运算、向量的点积、向量的叉积，以及这些概念的几何意义...下面我们将用<br><br>这些基本概念来解答GIS中一些几何问题。<br>1&nbsp;&nbsp; 点和线的关系<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点是否在线段上，这样的判断在图形编辑，拓扑判断(比如，GPS跟踪点是否跑在线上)需要用到这样的判断。通常的<br><br>想法是：先求线段的直线方程，再判断点是否符合这条直线方程，如果符合，还要判断点是否在线段所在的矩形区域(MBR)内<br><br>，以排除延长线上的可能性，如果不符合，则点不在线段上。这种思路是可行的，但效率不高，涉及到建立方程，解方程。<br><br>借助向量的叉积（也叫向量的向量积，结果还是向量，有方向的）可以很容易的判断。设向量a=(Xa,Ya,Za)&nbsp; b=(Xb,Yb,Zb)&nbsp; <br><br>向量叉积a X b如下：<br><br>二维向量叉积的模 |a X b|=|a|*|b|*sin&#945;=|Xa*Yb-Ya*Xb| （&#945;是向量a,b之间的夹角），向量叉积模的几何意义是以向量a,b<br><br>为邻边的平行四边形的面积。可以推测：如果两向量共线，向量叉积模(所代表的<br><br>平行四边形的面积) 为零 则&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>|a X b|=|a|*|b|*sin&#945;=|Xa*Yb-Ya*Xb|=0,否则不共线，叉积的模为非零，根据这样条件可以很轻松的判断点和线的关系，避<br><br>免了建立方程和解方程的麻烦。<br>&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 向量叉积的模|AB X AC|=0即可判断C点在AB所确定的直线上，再结合C点是否在AB所在的MBR范围内，就可以最终确<br><br>定C是否在AB线段上。关于点和线段的其他关系，都可以通过叉积的求得，比如 判断点在线的哪一侧，右手法则，可以通过a <br><br>X b= (Xa*Yb-Ya*Xb)*k中的（Xa*Yb-Ya*Xb）正负来判断。留给大家思考，很简单的，呵呵&#8230;<br>2&nbsp;&nbsp; 线和线的关系<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 判断两条线段是否相交，在很多拓扑判断和图形编辑 (比如，线的打断来构建拓扑，编辑线对象，叠置分析，面与<br><br>面关系的判断等) 中都需要用到线线相交的判断，如果两条线段相交，一条线段的两端点必然位于另一条线段的两侧（不考<br><br>虑退化情况，也就是一条线段的端点在另一条线段上，这个很容易判断）<br>&nbsp;<br><br>两向量的叉积a X b= (Xa*Yb-Ya*Xb)*k ，分别判断AB X AC的方向与AB X AD的方向是否异号，再判断CD X CA 的方向与CD X <br><br>CB的方向是否异号，即可判断两线段是否相交。<br><br>退化情况，即一条线的端点落在另一条线上。运用&#8221;点是否在线段上&#8221;的方法来判定。详细区分留给大家思考。呵呵&#8230;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 利用向量的方向还可以判断线段的转向，这个在道路导航中有所应用：<br>3&nbsp;&nbsp; 点和面的关系<br><br>在各种拓扑判断中（比如，面对象的选取，包含关系的判断等）需要判断一个点是否位于某个面内，经典的方法就是&#8220;垂线法<br><br>&#8221;，在直角坐标系中，从这个点向X轴作射线，判断射线与多边形的交点个数（不考虑退化情况，退化情况下，判断点或者射<br><br>线与多边形端点或者边的关系），如果为奇数，则点在面内，为偶数，则点在面外。<br>4&nbsp;&nbsp;&nbsp; 线和面的关系<br><br>线面关系的判断相对比较复杂，线在面内，线和面相交，相离，相接等关系。线段在面内，第一个必要条件是，线段的两个<br><br>端点都要在内。但由于多边形可能为凹，所以这不能成为判断的充分条件，于是有第二个必要条件线段与多边形的边，没有<br><br>内部交点。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 线段和多边形交于线段的两端点并不会影响线段是否在多边形内；但是如果多边形的某个顶点和线段相交，还必须<br><br>判断两相邻交点之间的线段是否包含于多边形内部，如果在面内，则线段在面内，否则不在面内。<br>&nbsp;<br><br>所以，算法思路如下（本算法引用网络上一篇文章）：<br><br>&nbsp;&nbsp;&nbsp;&nbsp; if 线段PQ的端点不都在多边形内<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then return false;<br>&nbsp;&nbsp;&nbsp; 点集pointSet初始化为空;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for 多边形的每条边s<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do if 线段的某个端点在s上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then 将该端点加入pointSet;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if s的某个端点在线段PQ上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then 将该端点加入pointSet;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if s和线段PQ相交 // 这时候已经可以肯定是内交了<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then return false;<br>&nbsp;&nbsp;&nbsp; 将pointSet中的点按照X-Y坐标排序;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for pointSet中每两个相邻点 pointSet[i] , pointSet[ i+1]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do if pointSet[i] , pointSet[ i+1] 的中点不在多边形中<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then return false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br><br>注：X-Y坐标排序，X坐标小的排在前面，对于X坐标相同的点，Y坐标小的排在前面，这种排序准则也是为了保证水平和垂直<br><br>情况的判断正确。<br><br>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点在面内，线段相交情况的判断见上面的思路。<br><br>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个过程中的排序因为交点数目肯定远小于多边形的顶点数目n，所以最多是常数级的复杂度，几乎可以忽略不计<br><br>。因此算法的时间复杂度也是O(n)。<br><br>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有了线段和面的关系，再判断折线与面的关系，也就可以for循环，同理进行判断了，但时间复杂度将是O(n^2)。<br><br>后面将介绍一种时间复杂度为O(nlogn)的&#8221;平面扫描算法&#8221;。<br><br>5&nbsp;&nbsp;&nbsp; 面和面的关系<br><br>面面的空间关系，可能要更复杂一些，在拓扑判断，多边形叠置分析，面对象的编辑中，有着广泛的应用。这个将在以后的<br><br>章节中介绍一种时间复杂度为O（nlogn）的算法&#8220;平面扫描算法&#8221;。<br>6&nbsp;&nbsp;&nbsp; 点到线段的距离<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点到线段的距离，在各种测量，拓扑判断(比如，线对象的选取中需要比较距离)中都需要用到。大家对点到直线的<br><br>距离，都很熟悉，那点到线段距离又该如何计算呢？<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 问题的关键是判断a、r的角度，向量的点积能判断一个角是钝角还是锐角，先复习一下向量的点积，也叫向量的数<br><br>量积,结果是一个数，没有方向。设向量a=(Xa,Ya,Za)&nbsp; b=(Xb,Yb,Zb)&nbsp; <br><br>a . b=|a|*|b|*cos&#945;=Xa*Xb+Ya*Yb+Za*Zb 向量点积的几何意义是，高中物理中，求作用力在一个方向上所作的功。如果a . <br><br>b&gt;0，则&#945;为锐角，a . b&lt;0,则&#945;钝角。<br><br>熟悉了利用向量的点积来判断角度，AC&#183;AB 判断夹角a，BA&#183;BC判断夹角r，即可确定三种情况中，具体是哪一种。至于第一种<br><br>情况，求点到垂足的距离，可以饶开建立方程求垂足，再求两点距离的思路，因为建立方程运算是复杂的，多耗了CPU资源。<br><br>利用向量叉积的几何意义来求，向量的叉积表示以两向量为邻边的平行四边形的面积，|AC X AB|为⊿ABC的面积的两倍，求<br><br>平行四边形的高,只要用面积除以底边AB的长度。即，高CD的长度=|AC X AB|/distance(AB)。<br><br>这些复杂的几何判断，都将在空间索引的过滤下，在少量数据集(侯选集)上进行。计算几何算法，通常是比较复杂，比较耗<br><br>CPU资源，而且还要考虑各种退化情况，在这里，并不试图向大家穷举各种情况，只想起一个抛砖引玉的作用， 或许还有人<br><br>会有这样的疑虑：有没考虑&#8220;投影&#8221;的问题？关于投影将在相应的章节中给予解释，但有一点是可以肯定的，空间分析、计算<br><br>几何算法，都是在平面直角坐标系下运算的，不会在球面上。<br><br><br> <img src ="http://www.cppblog.com/socketref/aggbug/133434.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2010-11-12 15:59 <a href="http://www.cppblog.com/socketref/archive/2010/11/12/133434.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>