<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>琥珀春秋</title>
	<atom:link href="http://amberlife.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://amberlife.net</link>
	<description>No pain No gain.</description>
	<lastBuildDate>Sat, 31 Mar 2012 10:26:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>面试题:一个字符串中找到第一个只出现一次的字符</title>
		<link>http://amberlife.net/2012/03/%e4%b8%80%e4%b8%aa%e5%ad%97%e7%ac%a6%e4%b8%b2%e4%b8%ad%e6%89%be%e5%88%b0%e7%ac%ac%e4%b8%80%e4%b8%aa%e5%8f%aa%e5%87%ba%e7%8e%b0%e4%b8%80%e6%ac%a1%e7%9a%84%e5%ad%97%e7%ac%a6/</link>
		<comments>http://amberlife.net/2012/03/%e4%b8%80%e4%b8%aa%e5%ad%97%e7%ac%a6%e4%b8%b2%e4%b8%ad%e6%89%be%e5%88%b0%e7%ac%ac%e4%b8%80%e4%b8%aa%e5%8f%aa%e5%87%ba%e7%8e%b0%e4%b8%80%e6%ac%a1%e7%9a%84%e5%ad%97%e7%ac%a6/#comments</comments>
		<pubDate>Sat, 31 Mar 2012 09:25:20 +0000</pubDate>
		<dc:creator>amberlife</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://amberlife.net/?p=398</guid>
		<description><![CDATA[今天逛水木，看到一道面试题，最简单的一个：“一个字符串中找到第一个只出现一次的字符”，大家争的没有一个结果，自己思考了一下，写了这么一个版本。主要考虑时间复杂度的降低，保证在o(n)内完成，组合利用hash表和queue两种数据结构完成。程序很简单，不解释 public static void main(String[] args){ char[] str = {&#8216;a&#8217;,'b&#8217;,'c&#8217;,'b&#8217;,'d&#8217;,'d&#8217;,'a&#8217;,'f&#8217;,'a&#8217;,'g&#8217;}; HashMap hash = new HashMap(); Queue queue = new LinkedList(); for(int i=0;i=2){ queue.poll(); } } System.out.println(queue.poll()); }]]></description>
			<content:encoded><![CDATA[<p>今天逛水木，看到一道面试题，最简单的一个：“一个字符串中找到第一个只出现一次的字符”，大家争的没有一个结果，自己思考了一下，写了这么一个版本。主要考虑时间复杂度的降低，保证在o(n)内完成，组合利用hash表和queue两种数据结构完成。程序很简单，不解释</p>
<p>public static void main(String[] args){<br />
char[] str = {&#8216;a&#8217;,'b&#8217;,'c&#8217;,'b&#8217;,'d&#8217;,'d&#8217;,'a&#8217;,'f&#8217;,'a&#8217;,'g&#8217;};<br />
HashMap<character ,Integer> hash = new HashMap</character><character ,Integer>();<br />
Queue</character><character> queue = new LinkedList</character><character>();<br />
for(int i=0;i<str .length;i++){<br />
hash.put(str[i], hash.get(str[i])!=null?hash.get(str[i])+1:1);<br />
if(hash.get(str[i])==1){<br />
queue.add(str[i]);<br />
}<br />
while(hash.get(queue.peek())>=2){<br />
queue.poll();<br />
}<br />
}<br />
System.out.println(queue.poll());<br />
}<br />
</str></character></p>
]]></content:encoded>
			<wfw:commentRss>http://amberlife.net/2012/03/%e4%b8%80%e4%b8%aa%e5%ad%97%e7%ac%a6%e4%b8%b2%e4%b8%ad%e6%89%be%e5%88%b0%e7%ac%ac%e4%b8%80%e4%b8%aa%e5%8f%aa%e5%87%ba%e7%8e%b0%e4%b8%80%e6%ac%a1%e7%9a%84%e5%ad%97%e7%ac%a6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SVN常用命令</title>
		<link>http://amberlife.net/2012/03/svn%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4/</link>
		<comments>http://amberlife.net/2012/03/svn%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4/#comments</comments>
		<pubDate>Sat, 31 Mar 2012 02:21:40 +0000</pubDate>
		<dc:creator>amberlife</dc:creator>
				<category><![CDATA[软件学习]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://amberlife.net/?p=396</guid>
		<description><![CDATA[     1、将文件checkout到本地目录 svn checkout path（path是服务器上的目录） 例如：svn checkout svn://192.168.1.1/pro/domain 简写：svn co 2、往版本库中添加新的文件 svn add file 例如：svn addtest.php(添加test.php) svn add *.php(添加当前目录下所有的php文件) 3、将改动的文件提交到版本库 svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(如果选择了保持锁，就使用–no-unlock开关) 例如：svn commit -m “add test file for my test“ test.php 简写：svn ci &#8230; <a href="http://amberlife.net/2012/03/svn%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div>     1、将文件checkout到本地目录<br />
svn checkout path（path是服务器上的目录）<br />
例如：svn checkout svn://192.168.1.1/pro/domain<br />
简写：svn co<br />
2、往版本库中添加新的文件<br />
svn add file<br />
例如：svn addtest.php(添加test.php)<br />
svn add *.php(添加当前目录下所有的php文件)<br />
3、将改动的文件提交到版本库<br />
svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(如果选择了保持锁，就使用–no-unlock开关)<br />
例如：svn commit -m “add test file for my test“ test.php<br />
简写：svn ci<br />
4、加锁/解锁<br />
svn lock -m “LockMessage“ [--force] PATH<br />
例如：svn lock -m “lock test file“ test.php<br />
svn unlock PATH<br />
5、更新到某个版本<br />
svn update -r m path<br />
例如：<br />
svn update如果后面没有目录，默认将当前目录以及子目录下的所有文件都更新到最新版本。<br />
svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)<br />
svn update test.php(更新，于版本库同步。如果在提交的时候提示过期的话，是因为冲突，需要先update，修改文件，然后清除svn resolved，最后再提交commit)<br />
简写：svn up<br />
6、查看文件或者目录状态<br />
1）svn status path（目录下的文件和子目录的状态，正常状态不显示）<br />
【?：不在svn的控制中；M：内容被修改；C：发生冲突；A：预定加入到版本库；K：被锁定】<br />
2）svn status -v path(显示文件和子目录状态)<br />
第一列保持相同，第二列显示工作版本号，第三和第四列显示最后一次修改的版本号和修改人。<br />
注：svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的，原因是svn在本地的.svn中保留了本地版本的原始拷贝。<br />
简写：svn st<br />
7、删除文件<br />
svn delete path -m “delete test fle“<br />
例如：svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”<br />
或者直接svn delete test.php 然后再svn ci -m ‘delete test file‘，推荐使用这种<br />
简写：svn (del, remove, rm)<br />
8、查看日志<br />
svn log path<br />
例如：svn log test.php 显示这个文件的所有修改记录，及其版本号的变化<br />
9、查看文件详细信息<br />
svn info path<br />
例如：svn info test.php<br />
10、比较差异<br />
svn diff path(将修改的文件与基础版本比较)<br />
例如：svn diff test.php<br />
svn diff -r m:n path(对版本m和版本n比较差异)<br />
例如：svn diff -r 200:201 test.php<br />
简写：svn di<br />
11、将两个版本之间的差异合并到当前文件<br />
svn merge -r m:n path<br />
例如：svn merge -r 200:205 test.php（将版本200与205之间的差异合并到当前文件，但是一般都会产生冲突，需要处理一下）<br />
12、SVN 帮助<br />
svn help<br />
svn help ci<br />
——————————————————————————<br />
以上是常用命令，下面写几个不经常用的<br />
——————————————————————————<br />
13、版本库下的文件和目录列表<br />
svn list path<br />
显示path目录下的所有属于版本库的文件和目录<br />
简写：svn ls<br />
14、创建纳入版本控制下的新目录<br />
svn mkdir: 创建纳入版本控制下的新目录。<br />
用法:<br />
1、mkdir PATH…<br />
2、mkdir URL…<br />
创建版本控制的目录。<br />
1、每一个以工作副本 PATH 指定的目录，都会创建在本地端，并且加入新增调度，以待下一次的提交。<br />
2、每个以URL指定的目录，都会透过立即提交于仓库中创建。在这两个情况下，所有的中间目录都必须事先存在。<br />
15、恢复本地修改</div>
<div>svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert:<br />
用法: revert PATH…<br />
注意: 本子命令不会存取网络，并且会解除冲突的状况。但是它不会恢复被删除的目录<br />
16、代码库URL变更</div>
<div>svn switch (sw): 更新工作副本至不同的URL。<br />
用法: 1、switch URL [PATH]<br />
2、switch –relocate FROM TO [PATH...]<br />
1、更新你的工作副本，映射到一个新的URL，其行为跟“svn update”很像，也会将服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的方法。<br />
2、改写工作副本的URL元数据，以反映单纯的URL上的改变。当仓库的根URL变动(比如方案名或是主机名称变动)，但是工作副本仍旧对映到同一仓库的同一目录时使用这个命令更新工作副本与仓库的对应关系。<br />
17、解决冲突<br />
svn resolved: 移除工作副本的目录或文件的“冲突”状态。<br />
用法: resolved PATH…<br />
注意: 本子命令不会依语法来解决冲突或是移除冲突标记；它只是移除冲突的<br />
相关文件，然后让 PATH 可以再次提交。<br />
18、输出指定文件或URL的内容。<br />
svn cat 目标[@版本]…如果指定了版本，将从指定的版本开始查找。<br />
svn cat -r PREV filename &gt; filename (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的)</div>
]]></content:encoded>
			<wfw:commentRss>http://amberlife.net/2012/03/svn%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>近期总结</title>
		<link>http://amberlife.net/2012/03/%e8%bf%91%e6%9c%9f%e6%80%bb%e7%bb%93/</link>
		<comments>http://amberlife.net/2012/03/%e8%bf%91%e6%9c%9f%e6%80%bb%e7%bb%93/#comments</comments>
		<pubDate>Thu, 29 Mar 2012 16:14:52 +0000</pubDate>
		<dc:creator>amberlife</dc:creator>
				<category><![CDATA[云计算之路]]></category>
		<category><![CDATA[心情随笔]]></category>
		<category><![CDATA[云计算，大图计算]]></category>
		<category><![CDATA[心得体会]]></category>

		<guid isPermaLink="false">http://amberlife.net/?p=393</guid>
		<description><![CDATA[来学校一个半月了，这一个半月一直在处理同名区分问题，代码重构了三次，小的改动我自己都记不清多少次。本以为在四月份去上海之前，能够把这个项目给搞定，但还是不行。现在卡在了算法复杂度的这个点上，必须做到剪枝，把所有不需要计算的东西，全部剪掉。同时要考虑内存使用量，尽量做到最小。今晚10点半的时候有了一个剪枝的新思路，应该可以降低两个数量级。我期望能在一分钟之内，处理完10000个节点的图，尽力而为。可以预见，在完成这个难点后，还会存在一个缓存的问题，而问题又不简简单单的像普通的建立缓存那样，如何建立分布式的缓存，如何保证分布式缓存的一致，是一个技术难点，还没有想好。]]></description>
			<content:encoded><![CDATA[<p>来学校一个半月了，这一个半月一直在处理同名区分问题，代码重构了三次，小的改动我自己都记不清多少次。本以为在四月份去上海之前，能够把这个项目给搞定，但还是不行。现在卡在了算法复杂度的这个点上，必须做到剪枝，把所有不需要计算的东西，全部剪掉。同时要考虑内存使用量，尽量做到最小。今晚10点半的时候有了一个剪枝的新思路，应该可以降低两个数量级。我期望能在一分钟之内，处理完10000个节点的图，尽力而为。可以预见，在完成这个难点后，还会存在一个缓存的问题，而问题又不简简单单的像普通的建立缓存那样，如何建立分布式的缓存，如何保证分布式缓存的一致，是一个技术难点，还没有想好。</p>
]]></content:encoded>
			<wfw:commentRss>http://amberlife.net/2012/03/%e8%bf%91%e6%9c%9f%e6%80%bb%e7%bb%93/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BSP编程模型理解</title>
		<link>http://amberlife.net/2012/03/bsp%e7%bc%96%e7%a8%8b%e6%a8%a1%e5%9e%8b%e7%90%86%e8%a7%a3/</link>
		<comments>http://amberlife.net/2012/03/bsp%e7%bc%96%e7%a8%8b%e6%a8%a1%e5%9e%8b%e7%90%86%e8%a7%a3/#comments</comments>
		<pubDate>Thu, 08 Mar 2012 06:56:13 +0000</pubDate>
		<dc:creator>amberlife</dc:creator>
				<category><![CDATA[云计算之路]]></category>
		<category><![CDATA[BSP]]></category>
		<category><![CDATA[hadoop]]></category>
		<category><![CDATA[HAMA]]></category>
		<category><![CDATA[云计算，大图计算]]></category>

		<guid isPermaLink="false">http://amberlife.net/?p=382</guid>
		<description><![CDATA[最近项目中要用到BSP模型，来完成一些大图的计算工作。 BSP （Bulk Synchronous Programming) 中文常翻译作 大同步编程。 在运行基于海量数据的大图算法时，对时间，还有空间都有很大的开销，单机无法满足需求，如何设计高效的面向云计算的分布式图算法，就越来越受到人们的关注。云计算原有的计算模型mapreduce，很难满足图算法的要求，做过mapreduce开发的人，都明白一点，mapreduce作为一种并行编程模式，学界称为易并行（EP Embarrassingly Parallel）计算模型，是很受限制的，节点与节点之间的交互，只有在map和reduce过程之间，通过shuffle才存在交互通信。而正是由于这种限制，使其无法完成大图的计算任务。 BSP编程模型，由哈佛大学Viliant和牛津大学Bill McColl提出。在BSP模型中，一个作业由一系列的superstep组成，每个superstep组成一个phase Parallel。BSP模型主要由3个有序的部分构成： 1本地计算 2通信 3 同步间隔 1 本地计算：在superstep中各个任务独立的完成计算任务  2在一个超级步结束前，利用消息传递机制，完成各个节点数据的交互 3 同步间隔：在一个superstep内的数据没有完成交互之前，同步等待，知道一个superstep中的交互工作全部完成了，才进入下一个superstep中，并继续作上述三步工作。 编程模型的介绍就到此为止，具体的参考资料： http://en.wikipedia.org/wiki/Bulk_synchronous_parallel 基于这个编程模型，google开发了pregel，在Google的整个计算体系中有20%的 计算是依赖于Pregel的计算模型，Google利用Pregel实现了图遍历(BFS)、最短路径(SSSP)、PageRank计算。详细了解google的pregel可以参考google的这篇论文：Pregel: a system for large-scale graph processing . 同样，伟大的apache也山寨了一个类似pregel的项目：HAMA 。要想了解这个编程框架的话，建议先读google的论文，在回过头来看学习应用HAMA 。]]></description>
			<content:encoded><![CDATA[<p>最近项目中要用到BSP模型，来完成一些大图的计算工作。</p>
<p>BSP （Bulk Synchronous Programming) 中文常翻译作 大同步编程。</p>
<p>在运行基于海量数据的大图算法时，对时间，还有空间都有很大的开销，单机无法满足需求，如何设计高效的面向云计算的分布式图算法，就越来越受到人们的关注。云计算原有的计算模型mapreduce，很难满足图算法的要求，做过mapreduce开发的人，都明白一点，mapreduce作为一种并行编程模式，学界称为易并行（EP Embarrassingly Parallel）计算模型，是很受限制的，节点与节点之间的交互，只有在map和reduce过程之间，通过shuffle才存在交互通信。而正是由于这种限制，使其无法完成大图的计算任务。</p>
<p>BSP编程模型，由哈佛大学Viliant和牛津大学Bill McColl提出。在BSP模型中，一个作业由一系列的superstep组成，每个superstep组成一个phase Parallel。BSP模型主要由3个有序的部分构成：<br />
1本地计算<br />
2通信<br />
3 同步间隔</p>
<p>1 本地计算：在superstep中各个任务独立的完成计算任务  2在一个超级步结束前，利用消息传递机制，完成各个节点数据的交互 3 同步间隔：在一个superstep内的数据没有完成交互之前，同步等待，知道一个superstep中的交互工作全部完成了，才进入下一个superstep中，并继续作上述三步工作。</p>
<p>编程模型的介绍就到此为止，具体的参考资料：</p>
<p><a href="http://en.wikipedia.org/wiki/Bulk_synchronous_parallel">http://en.wikipedia.org/wiki/Bulk_synchronous_parallel</a></p>
<p>基于这个编程模型，google开发了pregel，在Google的整个计算体系中有20%的 计算是依赖于Pregel的计算模型，Google利用Pregel实现了图遍历(BFS)、最短路径(SSSP)、PageRank计算。详细了解google的pregel可以参考google的这篇论文：<strong><a title="pregel： a system for large-scale graph processing" href="http://dl.acm.org/citation.cfm?id=1582723">Pregel: a system for large-scale graph processing</a> .</strong></p>
<p>同样，伟大的apache也山寨了一个类似pregel的项目：<a title="HAMA" href="http://incubator.apache.org/hama/" target="_blank">HAMA </a>。要想了解这个编程框架的话，建议先读google的论文，在回过头来看学习应用HAMA 。</p>
]]></content:encoded>
			<wfw:commentRss>http://amberlife.net/2012/03/bsp%e7%bc%96%e7%a8%8b%e6%a8%a1%e5%9e%8b%e7%90%86%e8%a7%a3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>凡事亲历亲为</title>
		<link>http://amberlife.net/2012/02/%e5%87%a1%e4%ba%8b%e4%ba%b2%e5%8e%86%e4%ba%b2%e4%b8%ba/</link>
		<comments>http://amberlife.net/2012/02/%e5%87%a1%e4%ba%8b%e4%ba%b2%e5%8e%86%e4%ba%b2%e4%b8%ba/#comments</comments>
		<pubDate>Wed, 29 Feb 2012 03:16:07 +0000</pubDate>
		<dc:creator>amberlife</dc:creator>
				<category><![CDATA[心情随笔]]></category>

		<guid isPermaLink="false">http://amberlife.net/?p=372</guid>
		<description><![CDATA[凡时还是得自己经历才行，不然过程不了解，终归要脱慢自己的进度。]]></description>
			<content:encoded><![CDATA[<p>凡时还是得自己经历才行，不然过程不了解，终归要脱慢自己的进度。</p>
]]></content:encoded>
			<wfw:commentRss>http://amberlife.net/2012/02/%e5%87%a1%e4%ba%8b%e4%ba%b2%e5%8e%86%e4%ba%b2%e4%b8%ba/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title> R语言矩阵运算</title>
		<link>http://amberlife.net/2012/02/r%e8%af%ad%e8%a8%80%e7%9f%a9%e9%98%b5%e8%bf%90%e7%ae%97/</link>
		<comments>http://amberlife.net/2012/02/r%e8%af%ad%e8%a8%80%e7%9f%a9%e9%98%b5%e8%bf%90%e7%ae%97/#comments</comments>
		<pubDate>Mon, 20 Feb 2012 04:14:02 +0000</pubDate>
		<dc:creator>amberlife</dc:creator>
				<category><![CDATA[R语言学习]]></category>

		<guid isPermaLink="false">http://amberlife.net/?p=365</guid>
		<description><![CDATA[主要包括以下内容： 创建矩阵向量；矩阵加减，乘积；矩阵的逆；行列式的值；特征值与特征向量；QR分解；奇异值分解；广义逆；backsolve与fowardsolve函数；取矩阵的上下三角元素；向量化算子等. 1 创建一个向量 在R中可以用函数c()来创建一个向量，例如： > x=c(1,2,3,4) > x [1] 1 2 3 4 2 创建一个矩阵 在R中可以用函数matrix()来创建一个矩阵，应用该函数时需要输入必要的参数值。 > args(matrix) function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL) data项为必要的矩阵元素，nrow为行数，ncol为列数，注意nrow与ncol的乘积应为矩阵元素个数，byrow项控制排列元素时是否按行进行，dimnames给定行和列的名称。例如： > matrix(1:12,nrow=3,ncol=4) [,1] [,2] &#8230; <a href="http://amberlife.net/2012/02/r%e8%af%ad%e8%a8%80%e7%9f%a9%e9%98%b5%e8%bf%90%e7%ae%97/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>主要包括以下内容：<br />
创建矩阵向量；矩阵加减，乘积；矩阵的逆；行列式的值；特征值与特征向量；QR分解；奇异值分解；广义逆；backsolve与fowardsolve函数；取矩阵的上下三角元素；向量化算子等.<br />
1   创建一个向量<br />
在R中可以用函数c()来创建一个向量，例如：<br />
> x=c(1,2,3,4)<br />
> x<br />
[1] 1 2 3 4<br />
2   创建一个矩阵<br />
在R中可以用函数matrix()来创建一个矩阵，应用该函数时需要输入必要的参数值。<br />
> args(matrix)<br />
function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)<br />
data项为必要的矩阵元素，nrow为行数，ncol为列数，注意nrow与ncol的乘积应为矩阵元素个数，byrow项控制排列元素时是否按行进行，dimnames给定行和列的名称。例如：<br />
> matrix(1:12,nrow=3,ncol=4)<br />
    [,1] [,2] [,3] [,4]<br />
[1,]   1   4   7   10<br />
[2,]   2   5   8   11<br />
[3,]   3   6   9   12<br />
> matrix(1:12,nrow=4,ncol=3)<br />
    [,1] [,2] [,3]<br />
[1,]   1   5   9<br />
[2,]   2   6   10<br />
[3,]   3   7   11<br />
[4,]   4   8   12<br />
> matrix(1:12,nrow=4,ncol=3,byrow=T)<br />
    [,1] [,2] [,3]<br />
[1,]   1   2   3<br />
[2,]   4   5   6<br />
[3,]   7   8   9<br />
[4,]   10   11   12<br />
> rowname<br />
[1] “r1&#8243; “r2&#8243; “r3&#8243;<br />
> colname=c(“c1&#8243;,”c2&#8243;,”c3&#8243;,”c4&#8243;)<br />
> colname<br />
[1] “c1&#8243; “c2&#8243; “c3&#8243; “c4&#8243;<br />
> matrix(1:12,nrow=3,ncol=4,dimnames=list(rowname,colname))<br />
  c1 c2 c3 c4<br />
r1 1 4 7 10<br />
r2 2 5 8 11<br />
3   矩阵转置<br />
A为m×n矩阵，求A&#8217;在R中可用函数t()，例如：<br />
> A=matrix(1:12,nrow=3,ncol=4)<br />
> A<br />
   [,1] [,2] [,3] [,4]<br />
[1,]   1   4   7   10<br />
[2,]   2   5   8   11<br />
[3,]   3   6   9   12<br />
> t(A)<br />
   [,1] [,2] [,3]<br />
[1,]   1   2   3<br />
[2,]   4   5   6<br />
[3,]   7   8   9<br />
[4,]   10   11   12<br />
若将函数t()作用于一个向量x，则R默认x为列向量，返回结果为一个行向量，例如：<br />
> x<br />
[1] 1 2 3 4 5 6 7 8 9 10<br />
> t(x)<br />
  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]<br />
[1,]   1   2   3   4   5   6   7   8   9   10<br />
> class(x)<br />
[1] “integer”<br />
> class(t(x))<br />
[1] “matrix”<br />
若想得到一个列向量，可用t(t(x))，例如：<br />
> x<br />
[1] 1 2 3 4 5 6 7 8 9 10<br />
> t(t(x))<br />
    [,1]<br />
[1,]   1<br />
[2,]   2<br />
[3,]   3<br />
[4,]   4<br />
[5,]   5<br />
[6,]   6<br />
[7,]   7<br />
[8,]   8<br />
[9,]   9<br />
[10,]  10<br />
> y=t(t(x))<br />
> t(t(y))<br />
    [,1]<br />
[1,]   1<br />
[2,]   2<br />
[3,]   3<br />
[4,]   4<br />
[5,]   5<br />
[6,]   6<br />
[7,]   7<br />
[8,]   8<br />
[9,]   9<br />
[10,]   10<br />
4   矩阵相加减<br />
在R中对同行同列矩阵相加减，可用符号：“＋”、“－”，例如：<br />
> A=B=matrix(1:12,nrow=3,ncol=4)<br />
> A+B<br />
    [,1] [,2] [,3] [,4]<br />
[1,]   2   8   14   20<br />
[2,]   4   10   16   22<br />
[3,]   6   12   18   24<br />
> A-B<br />
   [,1] [,2] [,3] [,4]<br />
[1,]   0   0   0   0<br />
[2,]   0   0   0   0<br />
[3,]   0   0   0   0<br />
5   数与矩阵相乘<br />
A为m×n矩阵，c>0，在R中求cA可用符号：“*”，例如：<br />
> c=2<br />
> c*A<br />
    [,1] [,2] [,3] [,4]<br />
[1,]   2   8   14   20<br />
[2,]   4   10  16   22<br />
[3,]   6   12  18   24<br />
6   矩阵相乘<br />
A为m×n矩阵，B为n×k矩阵，在R中求AB可用符号：“％*％”，例如：<br />
> A=matrix(1:12,nrow=3,ncol=4)<br />
> B=matrix(1:12,nrow=4,ncol=3)<br />
> A%*%B<br />
    [,1] [,2] [,3]<br />
[1,]   70  158 246<br />
[2,]   80  184 288<br />
[3,]   90  210 330<br />
若A为n×m矩阵，要得到A&#8217;B，可用函数crossprod()，该函数计算结果与t(A)%*%B相同，但是效率更高。例如：<br />
> A=matrix(1:12,nrow=4,ncol=3)<br />
> B=matrix(1:12,nrow=4,ncol=3)<br />
> t(A)%*%B<br />
    [,1] [,2] [,3]<br />
[1,]  30   70 110<br />
[2,]  70  174 278<br />
[3,] 110  278 446<br />
> crossprod(A,B)<br />
    [,1] [,2] [,3]<br />
[1,]  30  70 110<br />
[2,]  70 174 278<br />
[3,] 110 278 446<br />
矩阵Hadamard积：若A={aij}m×n, B={bij}m×n, 则矩阵的Hadamard积定义为：<br />
A⊙B={aij bij }m×n,R中Hadamard积可以直接运用运算符“*”例如：<br />
> A=matrix(1:16,4,4)<br />
> A<br />
    [,1] [,2] [,3] [,4]<br />
[1,]   1   5   9   13<br />
[2,]   2   6   10   14<br />
[3,]   3   7   11   15<br />
[4,]   4   8   12   16<br />
> B=A<br />
> A*B<br />
    [,1] [,2] [,3] [,4]<br />
[1,]   1   25   81 169<br />
[2,]   4   36 100 196<br />
[3,]   9   49 121 225<br />
[4,]   16   64 144 256<br />
R中这两个运算符的区别区加以注意。<br />
7   矩阵对角元素相关运算<br />
例如要取一个方阵的对角元素，<br />
> A=matrix(1:16,nrow=4,ncol=4)<br />
> A<br />
    [,1] [,2] [,3] [,4]<br />
[1,]   1   5   9   13<br />
[2,]   2   6   10   14<br />
[3,]   3   7   11   15<br />
[4,]   4   8   12   16<br />
> diag(A)<br />
[1] 1 6 11 16<br />
对一个向量应用diag()函数将产生以这个向量为对角元素的对角矩阵，例如：<br />
> diag(diag(A))<br />
    [,1] [,2] [,3] [,4]<br />
[1,]   1   0   0   0<br />
[2,]   0   6   0   0<br />
[3,]   0   0   11   0<br />
[4,]   0   0   0   16<br />
对一个正整数z应用diag()函数将产生以z维单位矩阵，例如：<br />
> diag(3)<br />
    [,1] [,2] [,3]<br />
[1,]   1   0   0<br />
[2,]   0   1   0<br />
[3,]   0   0   1<br />
8   矩阵求逆<br />
矩阵求逆可用函数solve()，应用solve(a, b)运算结果是解线性方程组ax = b，若b缺省，则系统默认为单位矩阵，因此可用其进行矩阵求逆，例如：<br />
> a=matrix(rnorm(16),4,4)<br />
> a<br />
            [,1]     [,2]     [,3]     [,4]<br />
[1,] 1.6986019   0.5239738 0.2332094 0.3174184<br />
[2,] -0.2010667 1.0913013 -1.2093734   0.8096514<br />
[3,] -0.1797628 -0.7573283 0.2864535 1.3679963<br />
[4,] -0.2217916 -0.3754700 0.1696771 -1.2424030<br />
> solve(a)<br />
              [,1]     [,2]     [,3]     [,4]<br />
[1,] 0.9096360 0.54057479 0.7234861 1.3813059<br />
[2,] -0.6464172 -0.91849017 -1.7546836 -2.6957775<br />
[3,] -0.7841661 -1.78780083 -1.5795262 -3.1046207<br />
[4,] -0.0741260 -0.06308603 0.1854137 -0.6607851<br />
> solve (a) %*%a<br />
                [,1]       [,2]           [,3]       [,4]<br />
[1,] 1.000000e+00 2.748453e-17 -2.787755e-17 -8.023096e-17<br />
[2,] 1.626303e-19 1.000000e+00 -4.960225e-18 6.977925e-16<br />
[3,] 2.135878e-17 -4.629543e-17 1.000000e+00 6.201636e-17<br />
[4,] 1.866183e-17 1.563962e-17 1.183813e-17 1.000000e+00<br />
9   矩阵的特征值与特征向量<br />
矩阵A的谱分解为A=UΛU&#8217;,其中Λ是由A的特征值组成的对角矩阵，U的列为A的特征值对应的特征向量，在R中可以用函数eigen()函数得到U和Λ，<br />
> args(eigen)<br />
function (x, symmetric, only.values = FALSE, EISPACK = FALSE)<br />
其中：x为矩阵，symmetric项指定矩阵x是否为对称矩阵，若不指定，系统将自动检测x是否为对称矩阵。例如：<br />
> A=diag(4)+1<br />
> A<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   2   1   1   1<br />
[2,]   1   2   1   1<br />
[3,]   1   1   2   1<br />
[4,]   1   1   1   2<br />
> A.eigen=eigen(A,symmetric=T)<br />
> A.eigen<br />
$values<br />
[1] 5 1 1 1</p>
<p>$vectors<br />
        [,1]     [,2]       [,3]     [,4]<br />
[1,] 0.5 0.8660254 0.000000e+00 0.0000000<br />
[2,] 0.5 -0.2886751 -6.408849e-17 0.8164966<br />
[3,] 0.5 -0.2886751 -7.071068e-01 -0.4082483<br />
[4,] 0.5 -0.2886751 7.071068e-01 -0.4082483</p>
<p>> A.eigen$vectors%*%diag(A.eigen$values)%*%t(A.eigen$vectors)<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   2   1   1   1<br />
[2,]   1   2   1   1<br />
[3,]   1   1   2   1<br />
[4,]   1   1   1   2<br />
> t(A.eigen$vectors)%*%A.eigen$vectors<br />
            [,1]       [,2]         [,3]         [,4]<br />
[1,] 1.000000e+00 4.377466e-17 1.626303e-17 -5.095750e-18<br />
[2,] 4.377466e-17 1.000000e+00 -1.694066e-18 6.349359e-18<br />
[3,] 1.626303e-17 -1.694066e-18 1.000000e+00 -1.088268e-16<br />
[4,] -5.095750e-18 6.349359e-18 -1.088268e-16 1.000000e+00<br />
10   矩阵的Choleskey分解<br />
  对于正定矩阵A，可对其进行Choleskey分解，即：A=P&#8217;P，其中P为上三角矩阵，在R中可以用函数chol()进行Choleskey分解，例如：<br />
> A<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   2   1   1   1<br />
[2,]   1   2   1   1<br />
[3,]   1   1   2   1<br />
[4,]   1   1   1   2<br />
> chol(A)<br />
        [,1]     [,2]     [,3]     [,4]<br />
[1,] 1.414214 0.7071068 0.7071068 0.7071068<br />
[2,] 0.000000 1.2247449 0.4082483 0.4082483<br />
[3,] 0.000000 0.0000000 1.1547005 0.2886751<br />
[4,] 0.000000 0.0000000 0.0000000 1.1180340<br />
> t(chol(A))%*%chol(A)<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   2   1   1   1<br />
[2,]   1   2   1   1<br />
[3,]   1   1   2   1<br />
[4,]   1   1   1   2<br />
> crossprod(chol(A),chol(A))<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   2   1   1   1<br />
[2,]   1   2   1   1<br />
[3,]   1   1   2   1<br />
[4,]   1   1   1   2<br />
若矩阵为对称正定矩阵，可以利用Choleskey分解求行列式的值，如：<br />
> prod(diag(chol(A))^2)<br />
[1] 5<br />
> det(A)<br />
[1] 5<br />
若矩阵为对称正定矩阵，可以利用Choleskey分解求矩阵的逆，这时用函数chol2inv()，这种用法更有效。如：<br />
> chol2inv(chol(A))<br />
      [,1] [,2] [,3] [,4]<br />
[1,] 0.8 -0.2 -0.2 -0.2<br />
[2,] -0.2 0.8 -0.2 -0.2<br />
[3,] -0.2 -0.2 0.8 -0.2<br />
[4,] -0.2 -0.2 -0.2 0.8<br />
> solve(A)<br />
  [,1] [,2] [,3] [,4]<br />
[1,] 0.8 -0.2 -0.2 -0.2<br />
[2,] -0.2 0.8 -0.2 -0.2<br />
[3,] -0.2 -0.2 0.8 -0.2<br />
[4,] -0.2 -0.2 -0.2 0.8<br />
11   矩阵奇异值分解<br />
  A为m×n矩阵，rank(A)= r, 可以分解为：A=UDV&#8217;,其中U&#8217;U=V&#8217;V=I。在R中可以用函数scd()进行奇异值分解，例如：<br />
> A=matrix(1:18,3,6)<br />
> A<br />
  [,1] [,2] [,3] [,4] [,5] [,6]<br />
[1,]   1   4   7   10   13   16<br />
[2,]   2   5   8   11   14   17<br />
[3,]   3   6   9   12   15   18<br />
> svd(A)<br />
$d<br />
[1] 4.589453e+01 1.640705e+00 3.627301e-16<br />
  $u<br />
          [,1]     [,2]     [,3]<br />
[1,] -0.5290354 0.74394551 0.4082483<br />
[2,] -0.5760715 0.03840487 -0.8164966<br />
[3,] -0.6231077 -0.66713577 0.4082483<br />
$v<br />
          [,1]     [,2]     [,3]<br />
[1,] -0.07736219 -0.7196003 -0.18918124<br />
[2,] -0.19033085 -0.5089325 0.42405898<br />
[3,] -0.30329950 -0.2982646 -0.45330031<br />
[4,] -0.41626816 -0.0875968 -0.01637004<br />
[5,] -0.52923682 0.1230711 0.64231130<br />
[6,] -0.64220548 0.3337389 -0.40751869<br />
> A.svd=svd(A)<br />
> A.svd$u%*%diag(A.svd$d)%*%t(A.svd$v)<br />
  [,1] [,2] [,3] [,4] [,5] [,6]<br />
[1,]   1   4   7   10   13   16<br />
[2,]   2   5   8   11   14   17<br />
[3,]   3   6   9   12   15   18<br />
> t(A.svd$u)%*%A.svd$u<br />
            [,1]       [,2]       [,3]<br />
[1,] 1.000000e+00 -1.169312e-16 -3.016793e-17<br />
[2,] -1.169312e-16 1.000000e+00 -3.678156e-17<br />
[3,] -3.016793e-17 -3.678156e-17 1.000000e+00<br />
> t(A.svd$v)%*%A.svd$v<br />
        [,1]       [,2]       [,3]<br />
[1,] 1.000000e+00 8.248068e-17 -3.903128e-18<br />
[2,] 8.248068e-17 1.000000e+00 -2.103352e-17<br />
[3,] -3.903128e-18 -2.103352e-17 1.000000e+00<br />
12   矩阵QR分解<br />
A为m×n矩阵可以进行QR分解，A=QR，其中：Q&#8217;Q＝I，在R中可以用函数qr()进行QR分解，例如：<br />
> A=matrix(1:16,4,4)<br />
> qr(A)<br />
$qr<br />
      [,1]     [,2]       [,3]       [,4]<br />
[1,] -5.4772256 -12.7801930 -2.008316e+01 -2.738613e+01<br />
[2,] 0.3651484 -3.2659863 -6.531973e+00 -9.797959e+00<br />
[3,] 0.5477226 -0.3781696 2.641083e-15 2.056562e-15<br />
[4,] 0.7302967 -0.9124744 8.583032e-01 -2.111449e-16</p>
<p>$rank<br />
[1] 2</p>
<p>$qraux<br />
[1] 1.182574e+00 1.156135e+00 1.513143e+00 2.111449e-16</p>
<p>$pivot<br />
[1] 1 2 3 4</p>
<p>attr(,”class”)<br />
[1] “qr”<br />
rank项返回矩阵的秩，qr项包含了矩阵Q和R的信息，要得到矩阵Q和R，可以用函数qr.Q()和qr.R()作用qr()的返回结果，例如：<br />
> qr.R(qr(A))<br />
      [,1]     [,2]       [,3]       [,4]<br />
[1,] -5.477226 -12.780193 -2.008316e+01 -2.738613e+01<br />
[2,] 0.000000 -3.265986 -6.531973e+00 -9.797959e+00<br />
[3,] 0.000000   0.000000 2.641083e-15 2.056562e-15<br />
[4,] 0.000000   0.000000 0.000000e+00 -2.111449e-16<br />
> qr.Q(qr(A))<br />
      [,1]       [,2]     [,3]     [,4]<br />
[1,] -0.1825742 -8.164966e-01 -0.4000874 -0.37407225<br />
[2,] -0.3651484 -4.082483e-01 0.2546329 0.79697056<br />
[3,] -0.5477226 -8.131516e-19 0.6909965 -0.47172438<br />
[4,] -0.7302967 4.082483e-01 -0.5455419 0.04882607<br />
> qr.Q(qr(A))%*%qr.R(qr(A))<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   1   5   9   13<br />
[2,]   2   6   10   14<br />
[3,]   3   7   11   15<br />
[4,]   4   8   12   16<br />
> t(qr.Q(qr(A)))%*%qr.Q(qr(A))<br />
        [,1]       [,2]       [,3]       [,4]<br />
[1,] 1.000000e+00 -1.457168e-16 -6.760001e-17 -7.659550e-17<br />
[2,] -1.457168e-16 1.000000e+00 -4.269046e-17 7.011739e-17<br />
[3,] -6.760001e-17 -4.269046e-17 1.000000e+00 -1.596437e-16<br />
[4,] -7.659550e-17 7.011739e-17 -1.596437e-16 1.000000e+00<br />
> qr.X(qr(A))<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   1   5   9   13<br />
[2,]   2   6   10   14<br />
[3,]   3   7   11   15<br />
[4,]   4   8   12   16<br />
13   矩阵广义逆(Moore-Penrose)<br />
  n×m矩阵A+称为m×n矩阵A的Moore-Penrose逆，如果它满足下列条件：<br />
①   A A+A=A；②A+A A+= A+；③(A A+)H=A A+；④(A+A)H= A+A<br />
在R的MASS包中的函数ginv()可计算矩阵A的Moore-Penrose逆，例如：<br />
library(“MASS”)<br />
> A<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   1   5   9   13<br />
[2,]   2   6   10   14<br />
[3,]   3   7   11   15<br />
[4,]   4   8   12   16<br />
> ginv(A)<br />
    [,1]   [,2] [,3]   [,4]<br />
[1,] -0.285 -0.1075 0.07 0.2475<br />
[2,] -0.145 -0.0525 0.04 0.1325<br />
[3,] -0.005 0.0025 0.01 0.0175<br />
[4,] 0.135 0.0575 -0.02 -0.0975<br />
验证性质1：<br />
> A%*%ginv(A)%*%A<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   1   5   9   13<br />
[2,]   2   6   10   14<br />
[3,]   3   7   11   15<br />
[4,]   4   8   12   16<br />
验证性质2：<br />
> ginv(A)%*%A%*%ginv(A)<br />
    [,1]   [,2] [,3]   [,4]<br />
[1,] -0.285 -0.1075 0.07 0.2475<br />
[2,] -0.145 -0.0525 0.04 0.1325<br />
[3,] -0.005 0.0025 0.01 0.0175<br />
[4,] 0.135 0.0575 -0.02 -0.0975<br />
验证性质3:<br />
> t(A%*%ginv(A))<br />
  [,1] [,2] [,3] [,4]<br />
[1,] 0.7 0.4 0.1 -0.2<br />
[2,] 0.4 0.3 0.2 0.1<br />
[3,] 0.1 0.2 0.3 0.4<br />
[4,] -0.2 0.1 0.4 0.7<br />
> A%*%ginv(A)<br />
  [,1] [,2] [,3] [,4]<br />
[1,] 0.7 0.4 0.1 -0.2<br />
[2,] 0.4 0.3 0.2 0.1<br />
[3,] 0.1 0.2 0.3 0.4<br />
[4,] -0.2 0.1 0.4 0.7<br />
验证性质4:<br />
> t(ginv(A)%*%A)<br />
  [,1] [,2] [,3] [,4]<br />
[1,] 0.7 0.4 0.1 -0.2<br />
[2,] 0.4 0.3 0.2 0.1<br />
[3,] 0.1 0.2 0.3 0.4<br />
[4,] -0.2 0.1 0.4 0.7<br />
> ginv(A)%*%A<br />
  [,1] [,2] [,3] [,4]<br />
[1,] 0.7 0.4 0.1 -0.2<br />
[2,] 0.4 0.3 0.2 0.1<br />
[3,] 0.1 0.2 0.3 0.4<br />
[4,] -0.2 0.1 0.4 0.7<br />
14   矩阵Kronecker积<br />
  n×m矩阵A与h×k矩阵B的kronecker积为一个nh×mk维矩阵，<br />
在R中kronecker积可以用函数kronecker()来计算，例如：<br />
> A=matrix(1:4,2,2)<br />
> B=matrix(rep(1,4),2,2)<br />
> A<br />
  [,1] [,2]<br />
[1,]   1   3<br />
[2,]   2   4<br />
> B<br />
  [,1] [,2]<br />
[1,]   1   1<br />
[2,]   1   1<br />
> kronecker(A,B)<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   1   1   3   3<br />
[2,]   1   1   3   3<br />
[3,]   2   2   4   4<br />
[4,]   2   2   4   4<br />
15   矩阵的维数<br />
  在R中很容易得到一个矩阵的维数，函数dim()将返回一个矩阵的维数，nrow()返回行数，ncol()返回列数，例如：<br />
  > A=matrix(1:12,3,4)<br />
> A<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   1   4   7   10<br />
[2,]   2   5   8   11<br />
[3,]   3   6   9   12<br />
> nrow(A)<br />
[1] 3<br />
> ncol(A)<br />
[1] 4<br />
16   矩阵的行和、列和、行平均与列平均<br />
  在R中很容易求得一个矩阵的各行的和、平均数与列的和、平均数，例如：<br />
  > A<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   1   4   7   10<br />
[2,]   2   5   8   11<br />
[3,]   3   6   9   12<br />
> rowSums(A)<br />
[1] 22 26 30<br />
> rowMeans(A)<br />
[1] 5.5 6.5 7.5<br />
> colSums(A)<br />
[1] 6 15 24 33<br />
> colMeans(A)<br />
[1] 2 5 8 11<br />
上述关于矩阵行和列的操作，还可以使用apply()函数实现。<br />
> args(apply)<br />
function (X, MARGIN, FUN, &#8230;)<br />
其中：x为矩阵，MARGIN用来指定是对行运算还是对列运算，MARGIN＝1表示对行运算，MARGIN＝2表示对列运算，FUN用来指定运算函数, &#8230;用来给定FUN中需要的其它的参数，例如：<br />
> apply(A,1,sum)<br />
[1] 22 26 30<br />
> apply(A,1,mean)<br />
[1] 5.5 6.5 7.5<br />
> apply(A,2,sum)<br />
[1] 6 15 24 33<br />
> apply(A,2,mean)<br />
[1] 2 5 8 11<br />
apply()函数功能强大，我们可以对矩阵的行或者列进行其它运算，例如：<br />
计算每一列的方差<br />
> A=matrix(rnorm(100),20,5)<br />
> apply(A,2,var)<br />
[1] 0.4641787 1.4331070 0.3186012 1.3042711 0.5238485<br />
> apply(A,2,function(x,a)x*a,a=2)<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   2   8   14   20<br />
[2,]   4   10   16   22<br />
[3,]   6   12   18   24<br />
注意：apply(A,2,function(x,a)x*a,a=2)与A*2效果相同，此处旨在说明如何应用alpply函数。<br />
17   矩阵X&#8217;X的逆<br />
  在统计计算中，我们常常需要计算这样矩阵的逆，如OLS估计中求系数矩阵。R中的包“strucchange”提供了有效的计算方法。<br />
  > args(solveCrossprod)<br />
function (X, method = c(“qr”, “chol”, “solve”))<br />
其中：method指定求逆方法，选用“qr”效率最高，选用“chol”精度最高，选用“slove”与slove(crossprod(x,x))效果相同，例如：<br />
> A=matrix(rnorm(16),4,4)<br />
> solveCrossprod(A,method=”qr”)<br />
      [,1]     [,2]     [,3]     [,4]<br />
[1,] 0.6132102 -0.1543924 -0.2900796 0.2054730<br />
[2,] -0.1543924 0.4779277 0.1859490 -0.2097302<br />
[3,] -0.2900796 0.1859490 0.6931232 -0.3162961<br />
[4,] 0.2054730 -0.2097302 -0.3162961 0.3447627<br />
> solveCrossprod(A,method=”chol”)<br />
      [,1]     [,2]     [,3]     [,4]<br />
[1,] 0.6132102 -0.1543924 -0.2900796 0.2054730<br />
[2,] -0.1543924 0.4779277 0.1859490 -0.2097302<br />
[3,] -0.2900796 0.1859490 0.6931232 -0.3162961<br />
[4,] 0.2054730 -0.2097302 -0.3162961 0.3447627<br />
> solveCrossprod(A,method=”solve”)<br />
      [,1]     [,2]     [,3]     [,4]<br />
[1,] 0.6132102 -0.1543924 -0.2900796 0.2054730<br />
[2,] -0.1543924 0.4779277 0.1859490 -0.2097302<br />
[3,] -0.2900796 0.1859490 0.6931232 -0.3162961<br />
[4,] 0.2054730 -0.2097302 -0.3162961 0.3447627<br />
> solve(crossprod(A,A))<br />
      [,1]     [,2]     [,3]     [,4]<br />
[1,] 0.6132102 -0.1543924 -0.2900796 0.2054730<br />
[2,] -0.1543924 0.4779277 0.1859490 -0.2097302<br />
[3,] -0.2900796 0.1859490 0.6931232 -0.3162961<br />
[4,] 0.2054730 -0.2097302 -0.3162961 0.3447627<br />
18   取矩阵的上、下三角部分<br />
  在R中，我们可以很方便的取到一个矩阵的上、下三角部分的元素，函数lower.tri()和函数upper.tri()提供了有效的方法。<br />
  > args(lower.tri)<br />
function (x, diag = FALSE)<br />
函数将返回一个逻辑值矩阵，其中下三角部分为真，上三角部分为假，选项diag为真时包含对角元素，为假时不包含对角元素。upper.tri()的效果与之孑然相反。例如：<br />
> A<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   1   5   9   13<br />
[2,]   2   6   10   14<br />
[3,]   3   7   11   15<br />
[4,]   4   8   12   16<br />
> lower.tri(A)<br />
    [,1] [,2] [,3] [,4]<br />
[1,] FALSE FALSE FALSE FALSE<br />
[2,] TRUE FALSE FALSE FALSE<br />
[3,] TRUE TRUE FALSE FALSE<br />
[4,] TRUE TRUE TRUE FALSE<br />
> lower.tri(A,diag=T)<br />
  [,1] [,2] [,3] [,4]<br />
[1,] TRUE FALSE FALSE FALSE<br />
[2,] TRUE TRUE FALSE FALSE<br />
[3,] TRUE TRUE TRUE FALSE<br />
[4,] TRUE TRUE TRUE TRUE<br />
> upper.tri(A)<br />
    [,1] [,2] [,3] [,4]<br />
[1,] FALSE TRUE TRUE TRUE<br />
[2,] FALSE FALSE TRUE TRUE<br />
[3,] FALSE FALSE FALSE TRUE<br />
[4,] FALSE FALSE FALSE FALSE<br />
> upper.tri(A,diag=T)<br />
    [,1] [,2] [,3] [,4]<br />
[1,] TRUE TRUE TRUE TRUE<br />
[2,] FALSE TRUE TRUE TRUE<br />
[3,] FALSE FALSE TRUE TRUE<br />
[4,] FALSE FALSE FALSE TRUE<br />
> A[lower.tri(A)]=0<br />
> A<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   1   5   9   13<br />
[2,]   0   6   10   14<br />
[3,]   0   0   11   15<br />
[4,]   0   0   0   16<br />
> A[upper.tri(A)]=0<br />
> A<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   1   0   0   0<br />
[2,]   2   6   0   0<br />
[3,]   3   7   11   0<br />
[4,]   4   8   12   16<br />
19   backsolve&#038;fowardsolve函数<br />
这两个函数用于解特殊线性方程组，其特殊之处在于系数矩阵为上或下三角。<br />
> args(backsolve)<br />
function (r, x, k = ncol(r), upper.tri = TRUE, transpose = FALSE)<br />
> args(forwardsolve)<br />
function (l, x, k = ncol(l), upper.tri = FALSE, transpose = FALSE)<br />
其中：r或者l为n×n维三角矩阵，x为n×1维向量，对给定不同的upper.tri和transpose的值，方程的形式不同<br />
对于函数backsolve()而言，<br />
例如：<br />
  > A=matrix(1:9,3,3)<br />
> A<br />
  [,1] [,2] [,3]<br />
[1,]   1   4   7<br />
[2,]   2   5   8<br />
[3,]   3   6   9<br />
> x=c(1,2,3)<br />
> x<br />
[1] 1 2 3<br />
> B=A<br />
> B[upper.tri(B)]=0<br />
> B<br />
  [,1] [,2] [,3]<br />
[1,]   1   0   0<br />
[2,]   2   5   0<br />
[3,]   3   6   9<br />
> C=A<br />
> C[lower.tri(C)]=0<br />
> C<br />
  [,1] [,2] [,3]<br />
[1,]   1   4   7<br />
[2,]   0   5   8<br />
[3,]   0   0   9<br />
> backsolve(A,x,upper.tri=T,transpose=T)<br />
[1] 1.00000000 -0.40000000 -0.08888889<br />
> solve(t(C),x)<br />
[1] 1.00000000 -0.40000000 -0.08888889<br />
> backsolve(A,x,upper.tri=T,transpose=F)<br />
[1] -0.8000000 -0.1333333 0.3333333<br />
> solve(C,x)<br />
[1] -0.8000000 -0.1333333 0.3333333<br />
> backsolve(A,x,upper.tri=F,transpose=T)<br />
[1] 1.111307e-17 2.220446e-17 3.333333e-01<br />
> solve(t(B),x)<br />
[1] 1.110223e-17 2.220446e-17 3.333333e-01<br />
> backsolve(A,x,upper.tri=F,transpose=F)<br />
[1] 1 0 0<br />
> solve(B,x)<br />
[1] 1.000000e+00 -1.540744e-33 -1.850372e-17<br />
对于函数forwardsolve()而言，<br />
例如：<br />
  > A<br />
      [,1] [,2] [,3]<br />
[1,]   1   4   7<br />
[2,]   2   5   8<br />
[3,]   3   6   9<br />
> B<br />
  [,1] [,2] [,3]<br />
[1,]   1   0   0<br />
[2,]   2   5   0<br />
[3,]   3   6   9<br />
> C<br />
  [,1] [,2] [,3]<br />
[1,]   1   4   7<br />
[2,]   0   5   8<br />
[3,]   0   0   9<br />
> x<br />
[1] 1 2 3<br />
> forwardsolve(A,x,upper.tri=T,transpose=T)<br />
[1] 1.00000000 -0.40000000 -0.08888889<br />
> solve(t(C),x)<br />
[1] 1.00000000 -0.40000000 -0.08888889<br />
> forwardsolve(A,x,upper.tri=T,transpose=F)<br />
[1] -0.8000000 -0.1333333 0.3333333<br />
> solve(C,x)<br />
[1] -0.8000000 -0.1333333 0.3333333<br />
> forwardsolve(A,x,upper.tri=F,transpose=T)<br />
[1] 1.111307e-17 2.220446e-17 3.333333e-01<br />
> solve(t(B),x)<br />
[1] 1.110223e-17 2.220446e-17 3.333333e-01<br />
> forwardsolve(A,x,upper.tri=F,transpose=F)<br />
[1] 1 0 0<br />
> solve(B,x)<br />
[1] 1.000000e+00 -1.540744e-33 -1.850372e-17<br />
20   row()与col()函数<br />
在R中定义了的这两个函数用于取矩阵元素的行或列下标矩阵，例如矩阵A={aij}m×n，<br />
row()函数将返回一个与矩阵A有相同维数的矩阵，该矩阵的第i行第j列元素为i，函数col()类似。例如：<br />
> x=matrix(1:12,3,4)<br />
> row(x)<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   1   1   1   1<br />
[2,]   2   2   2   2<br />
[3,]   3   3   3   3<br />
> col(x)<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   1   2   3   4<br />
[2,]   1   2   3   4<br />
[3,]   1   2   3   4<br />
这两个函数同样可以用于取一个矩阵的上下三角矩阵，例如：<br />
> x<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   1   4   7   10<br />
[2,]   2   5   8   11<br />
[3,]   3   6   9   12<br />
> x[row(x)<br />
<col (x)]=0<br />
> x<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   1   0   0   0<br />
[2,]   2   5   0   0<br />
[3,]   3   6   9   0<br />
> x=matrix(1:12,3,4)<br />
> x[row(x)>col(x)]=0<br />
> x<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   1   4   7   10<br />
[2,]   0   5   8   11<br />
[3,]   0   0   9   12<br />
21   行列式的值<br />
在R中，函数det(x)将计算方阵x的行列式的值，例如：<br />
> x=matrix(rnorm(16),4,4)<br />
> x<br />
      [,1]     [,2]     [,3]     [,4]<br />
[1,] -1.0736375 0.2809563 -1.5796854 0.51810378<br />
[2,] -1.6229898 -0.4175977 1.2038194 -0.06394986<br />
[3,] -0.3989073 -0.8368334 -0.6374909 -0.23657088<br />
[4,] 1.9413061 0.8338065 -1.5877162 -1.30568465<br />
> det(x)<br />
[1] 5.717667<br />
22向量化算子<br />
在R中可以很容易的实现向量化算子，例如：<br />
vec< -function (x){<br />
          t(t(as.vector(x)))<br />
}<br />
vech<-function (x){<br />
          t(x[lower.tri(x,diag=T)])<br />
}<br />
> x=matrix(1:12,3,4)<br />
> x<br />
  [,1] [,2] [,3] [,4]<br />
[1,]   1   4   7   10<br />
[2,]   2   5   8   11<br />
[3,]   3   6   9   12<br />
> vec(x)<br />
    [,1]<br />
[1,]   1<br />
[2,]   2<br />
[3,]   3<br />
[4,]   4<br />
[5,]   5<br />
[6,]   6<br />
[7,]   7<br />
[8,]   8<br />
[9,]   9<br />
[10,]   10<br />
[11,]   11<br />
[12,]   12<br />
> vech(x)<br />
  [,1] [,2] [,3] [,4] [,5] [,6]<br />
[1,]   1   2   3   5   6   9<br />
23   时间序列的滞后值<br />
  在时间序列分析中，我们常常要用到一个序列的滞后序列，R中的包“fMultivar”中的函数tslag()提供了这个功能。<br />
  > args(tslag)<br />
function (x, k = 1, trim = FALSE)<br />
其中：x为一个向量，k指定滞后阶数，可以是一个自然数列，若trim为假，则返回序列与原序列长度相同，但含有NA值；若trim项为真，则返回序列中不含有NA值，例如：<br />
> x=1:20<br />
> tslag(x,1:4,trim=F)<br />
    [,1] [,2] [,3] [,4]<br />
[1,]   NA   NA   NA   NA<br />
[2,]   1   NA   NA   NA<br />
[3,]   2   1   NA   NA<br />
[4,]   3   2   1   NA<br />
[5,]   4   3   2   1<br />
[6,]   5   4   3   2<br />
[7,]   6   5   4   3<br />
[8,]   7   6   5   4<br />
[9,]   8   7   6   5<br />
[10,]   9   8   7   6<br />
[11,]   10   9   8   7<br />
[12,]   11   10   9   8<br />
[13,]   12   11   10   9<br />
[14,]   13   12   11   10<br />
[15,]   14   13   12   11<br />
[16,]   15   14   13   12<br />
[17,]   16   15   14   13<br />
[18,]   17   16   15   14<br />
[19,]   18   17   16   15<br />
[20,]   19   18   17   16<br />
> tslag(x,1:4,trim=T)<br />
    [,1] [,2] [,3] [,4]<br />
[1,]   4   3   2   1<br />
[2,]   5   4   3   2<br />
[3,]   6   5   4   3<br />
[4,]   7   6   5   4<br />
[5,]   8   7   6   5<br />
[6,]   9   8   7   6<br />
[7,]   10   9   8   7<br />
[8,]   11   10   9   8<br />
[9,]   12   11   10   9<br />
[10,]   13   12   11   10<br />
[11,]   14   13   12   11<br />
[12,]   15   14   13   12<br />
[13,]   16   15   14   13<br />
[14,]   17   16   15   14<br />
[15,]   18   17   16   15<br />
[16,]   19   18   17   16</col>
]]></content:encoded>
			<wfw:commentRss>http://amberlife.net/2012/02/r%e8%af%ad%e8%a8%80%e7%9f%a9%e9%98%b5%e8%bf%90%e7%ae%97/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>R语言读书笔记</title>
		<link>http://amberlife.net/2012/02/r%e8%af%ad%e8%a8%80%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0-2/</link>
		<comments>http://amberlife.net/2012/02/r%e8%af%ad%e8%a8%80%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0-2/#comments</comments>
		<pubDate>Mon, 20 Feb 2012 04:12:55 +0000</pubDate>
		<dc:creator>amberlife</dc:creator>
				<category><![CDATA[R语言学习]]></category>

		<guid isPermaLink="false">http://amberlife.net/?p=362</guid>
		<description><![CDATA[R语言的数组 1   1.1向量只有定义了dim属性后，才能作为数组在R中使用。 向量定义方式:dim(z)&#60;-c(3,5,100) 。该向量成为一个3*5*100的数组 1.2 数据向量（data vector)的值在数组中的排列，采用类似Fortran方式，即”按列优先” 2   索引数组. 根据索引数组去给数组中不规则的元素集合赋值，在一个二维索引数组中，索引矩阵u假定含有两列及任意多行，索引矩阵中的元素就是数组的行列索引。 例：一个4*5的数组x x&#60;-array(1:20,dim=c(4,5)) 索引数组 i&#60;-array(c(1:3,3:1),dim=c(3:2)) 那么x[i]={9,6,3}。我们获取的也就是x[1,3],x[2,2],x[3,1]这对应的三个元素。 3  array()函数 构建数组的方法： 1 通过dim属性的方法创建 2 直接通过array函数从向量转换而来。 z&#60;-array(c(1:24),dim=c(3,4,2)) dim(z)&#60;-c(3,4,2) 这二者创造出来数组的结构是一样的。都是3*4*2的数组z。不过第一个有元素，第二个没有。 4 数组的外积 。 记作 a%o%b 例： a&#60;-(1:3) b&#60;-(1:3) 5 数组的广义转置 B&#60;-aperm(A,c(2,1)) B相当于把数组A的第2维作为第一维，第一维作为第2维。通俗的讲，就是行列转置，放在矩阵里面相当于B是A的转置矩阵。]]></description>
			<content:encoded><![CDATA[<p>R语言的数组</p>
<p>1   1.1向量只有定义了dim属性后，才能作为数组在R中使用。</p>
<p>向量定义方式:dim(z)&lt;-c(3,5,100) 。该向量成为一个3*5*100的数组</p>
<p>1.2 数据向量（data vector)的值在数组中的排列，采用类似Fortran方式，即”按列优先”</p>
<p>2   索引数组. 根据索引数组去给数组中不规则的元素集合赋值，在一个二维索引数组中，索引矩阵u假定含有两列及任意多行，索引矩阵中的元素就是数组的行列索引。</p>
<p>例：一个4*5的数组x</p>
<p>x&lt;-array(1:20,dim=c(4,5))</p>
<p>索引数组 i&lt;-array(c(1:3,3:1),dim=c(3:2))</p>
<p>那么x[i]={9,6,3}。我们获取的也就是x[1,3],x[2,2],x[3,1]这对应的三个元素。</p>
<p>3  array()函数</p>
<p>构建数组的方法：</p>
<p>1 通过dim属性的方法创建</p>
<p>2 直接通过array函数从向量转换而来。</p>
<p>z&lt;-array(c(1:24),dim=c(3,4,2))</p>
<p>dim(z)&lt;-c(3,4,2)</p>
<p>这二者创造出来数组的结构是一样的。都是3*4*2的数组z。不过第一个有元素，第二个没有。</p>
<p>4 数组的外积 。 记作 a%o%b</p>
<p>例： a&lt;-(1:3)</p>
<p>b&lt;-(1:3)</p>
<p>5 数组的广义转置</p>
<p>B&lt;-aperm(A,c(2,1))</p>
<p>B相当于把数组A的第2维作为第一维，第一维作为第2维。通俗的讲，就是行列转置，放在矩阵里面相当于B是A的转置矩阵。</p>
]]></content:encoded>
			<wfw:commentRss>http://amberlife.net/2012/02/r%e8%af%ad%e8%a8%80%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>R语言读书笔记</title>
		<link>http://amberlife.net/2011/12/r%e8%af%ad%e8%a8%80%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0/</link>
		<comments>http://amberlife.net/2011/12/r%e8%af%ad%e8%a8%80%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0/#comments</comments>
		<pubDate>Sun, 25 Dec 2011 16:47:29 +0000</pubDate>
		<dc:creator>amberlife</dc:creator>
				<category><![CDATA[R语言学习]]></category>
		<category><![CDATA[R]]></category>

		<guid isPermaLink="false">http://amberlife.net/?p=360</guid>
		<description><![CDATA[最近项目需要，所以要学习下R语言，对于数学基础不好的我，着实有点痛苦，现在再次看到线性代数和概率统计的东西着实让我难受，天下无难事，努力做好最重要。 下面是我自己学习R语言的一些笔记，不是很完善，如果想系统学习R语言，建议先在网上找一本完整的学习手册进行学习。这是我个人的一些理解，不正确的地方，还望大家共同讨论。 1 索引向量：在R语言中，向量vector是个很常见的数据结构，回忆下线代这门课，就应该知道向量代表什么了。而索引向量，所起的作用就是当你需要获取一个向量的子集的时候，可以通过在向量名后面的方括号中加入索引向量而得到。简单的讲，就像是我们编程中用得数组，比如向量A，要获取向量A的第1，2,3个元素，那么写成Asubset&#60;- A[1:3]即可。1:3就是代表1到3的索引向量。 索引向量可以是下面的四种形式。 1 逻辑向量 。当索引向量是逻辑向量时，索引向量必须同被挑选元素的向量长度一致，向量中对应索引向量为true的元素被选中。 2 正整数向量。索引向量必须是[1,2,...,length(x)]的子向量，注意从1开始 3负整数向量。指定被排除的元素而不是包括进来的元素。 4 字符串向量，当一个向量中的元素可以用names属性来识别的时候，字符串向量很有用。 2 R语言对象及它的模式和属性。 在R中，任何被操作的实体都被称之为对象。 实数，向量（字符型，逻辑型）都被称为“原子型”对象。这是因为它们的元素都是同样的类型。 向量：必须保证所有的元素都是一样的模式 列表：可以为任何模式的对象的有序序列 函数、表达式：具有递归结构的对象。 在对象中，有两个内在的属性，是任何对象都有的。他们就是对象的模式（mode）和对象的长度（length）。 对象的属性，可以通过attributes(object)获取。 对象模式（mode）可以通过下面的方式转换： as.character(obj) 将obj对象模式转换成字符型 as.integer(obj) 将obj对象模式转换成整型。 对象长度的转换。 增加长度：对象长度可以通过给定一个不在先前索引范围内的索引值而得到改变。例如： e&#60;-character()  给e赋一个空的字符型对象，显然这个时候length(e)是等于1的。 e[3]&#60;-&#8217;a&#8217; ; length(e)=3 .当给e一个不再先前索引范围内的索引值（先前索引范围为1，现在索引反胃为1,2,3）这时候，对象e的长度就为3了。 删减长度：对象长度的减少，只需要做相应的赋值操作即可。例如： a&#60;-a[2*1:5]，由于“：”的优先级高，所以此时的索引向量为[2,4,6,8,10].此操作相当于只保留a对象中偶数索引位[2,4,6,8,10]的值。所以此时length(a)=5. 我们继续操作a这个对象，length(a)&#60;-3 .这样就把a的长度删减到3了。这个操作同样也适用于扩充对象. &#8230; <a href="http://amberlife.net/2011/12/r%e8%af%ad%e8%a8%80%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>最近项目需要，所以要学习下R语言，对于数学基础不好的我，着实有点痛苦，现在再次看到线性代数和概率统计的东西着实让我难受，天下无难事，努力做好最重要。<br />
下面是我自己学习R语言的一些笔记，不是很完善，如果想系统学习R语言，建议先在网上找一本完整的学习手册进行学习。这是我个人的一些理解，不正确的地方，还望大家共同讨论。<br />
1 索引向量：在R语言中，向量vector是个很常见的数据结构，回忆下线代这门课，就应该知道向量代表什么了。而索引向量，所起的作用就是当你需要获取一个向量的子集的时候，可以通过在向量名后面的方括号中加入索引向量而得到。简单的讲，就像是我们编程中用得数组，比如向量A，要获取向量A的第1，2,3个元素，那么写成Asubset&lt;- A[1:3]即可。1:3就是代表1到3的索引向量。<br />
索引向量可以是下面的四种形式。<br />
1 逻辑向量 。当索引向量是逻辑向量时，索引向量必须同被挑选元素的向量长度一致，向量中对应索引向量为true的元素被选中。</p>
<p>2 正整数向量。索引向量必须是[1,2,...,length(x)]的子向量，注意从1开始</p>
<p>3负整数向量。指定被排除的元素而不是包括进来的元素。</p>
<p>4 字符串向量，当一个向量中的元素可以用names属性来识别的时候，字符串向量很有用。</p>
<p>2 R语言对象及它的模式和属性。</p>
<p>在R中，任何被操作的实体都被称之为对象。</p>
<p>实数，向量（字符型，逻辑型）都被称为“原子型”对象。这是因为它们的元素都是同样的类型。</p>
<p>向量：必须保证所有的元素都是一样的模式</p>
<p>列表：可以为任何模式的对象的有序序列</p>
<p>函数、表达式：具有递归结构的对象。</p>
<p>在对象中，有两个内在的属性，是任何对象都有的。他们就是对象的模式（mode）和对象的长度（length）。</p>
<p>对象的属性，可以通过attributes(object)获取。</p>
<p>对象模式（mode）可以通过下面的方式转换：</p>
<p>as.character(obj) 将obj对象模式转换成字符型</p>
<p>as.integer(obj) 将obj对象模式转换成整型。</p>
<p>对象长度的转换。</p>
<p>增加长度：对象长度可以通过给定一个不在先前索引范围内的索引值而得到改变。例如：</p>
<p>e&lt;-character()  给e赋一个空的字符型对象，显然这个时候length(e)是等于1的。</p>
<p>e[3]&lt;-&#8217;a&#8217; ; length(e)=3 .当给e一个不再先前索引范围内的索引值（先前索引范围为1，现在索引反胃为1,2,3）这时候，对象e的长度就为3了。</p>
<p>删减长度：对象长度的减少，只需要做相应的赋值操作即可。例如：</p>
<p>a&lt;-a[2*1:5]，由于“：”的优先级高，所以此时的索引向量为[2,4,6,8,10].此操作相当于只保留a对象中偶数索引位[2,4,6,8,10]的值。所以此时length(a)=5.</p>
<p>我们继续操作a这个对象，length(a)&lt;-3 .这样就把a的长度删减到3了。这个操作同样也适用于扩充对象.</p>
<p>设置或读取对象属性</p>
<p>attributes(object) 读取对象非内在属性。</p>
<p>attr(object,name) 读取或设置属性名为name的属性值</p>
<p>attr(Z,&#8217;dim&#8217;)&lt;-c(10,10).对象Z有一个dim的属性，dim属性被赋值为10*10.它表示的意思是Z对象可以被当做一个10*10的矩阵，（dim属性表示一个对象为一个矩阵）</p>
]]></content:encoded>
			<wfw:commentRss>http://amberlife.net/2011/12/r%e8%af%ad%e8%a8%80%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>搜索引擎读书笔记－nutch 和heritrix的区别和联系</title>
		<link>http://amberlife.net/2011/12/%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0%ef%bc%8dnutch-%e5%92%8cheritrix%e7%9a%84%e5%8c%ba%e5%88%ab%e5%92%8c%e8%81%94%e7%b3%bb/</link>
		<comments>http://amberlife.net/2011/12/%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0%ef%bc%8dnutch-%e5%92%8cheritrix%e7%9a%84%e5%8c%ba%e5%88%ab%e5%92%8c%e8%81%94%e7%b3%bb/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 01:37:03 +0000</pubDate>
		<dc:creator>amberlife</dc:creator>
				<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://amberlife.net/2011/12/%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0%ef%bc%8dnutch-%e5%92%8cheritrix%e7%9a%84%e5%8c%ba%e5%88%ab%e5%92%8c%e8%81%94%e7%b3%bb/</guid>
		<description><![CDATA[Heritrix 和 Nutch。二者均为Java开源框架，Heritrix 是 SourceForge上的开源产品，Nutch为Apache的一个子项目，它们都称作网络爬虫/蜘蛛（ Web Crawler），它们实现的原理基本一致：深度遍历网站的资源，将这些资源抓取到本地，使用的方法都是分析网站每一个有效的URI，并提交Http请求，从而获得相应结果，生成本地文件及相应的日志信息等。 Heritrix 是个 “archival crawler” &#8212; 用来获取完整的、精确的、站点内容的深度复制。包括获取图像以及其他非文本内容。抓取并存储相关的内容。对内容来者不拒，不对页面进行内容上的修改。重新爬行对相同的URL不针对先前的进行替换。爬虫通过Web用户界面启动、监控、调整，允许弹性的定义要获取的URL。 二者的差异： Nutch 只获取并保存可索引的内容。Heritrix则是照单全收。力求保存页面原貌 Nutch 可以修剪内容，或者对内容格式进行转换。 Nutch 保存内容为数据库优化格式便于以后索引；刷新替换旧的内容。而Heritrix 是添加(追加)新的内容。 Nutch 从命令行运行、控制。Heritrix 有 Web 控制管理界面。 Nutch 的定制能力不够强，不过现在已经有了一定改进。Heritrix 可控制的参数更多。]]></description>
			<content:encoded><![CDATA[<p>Heritrix 和 Nutch。二者均为Java开源框架，Heritrix 是 SourceForge上的开源产品，Nutch为Apache的一个子项目，它们都称作网络爬虫/蜘蛛（ Web Crawler），它们实现的原理基本一致：深度遍历网站的资源，将这些资源抓取到本地，使用的方法都是分析网站每一个有效的URI，并提交Http请求，从而获得相应结果，生成本地文件及相应的日志信息等。<br />
Heritrix 是个 “archival crawler” &#8212; 用来获取完整的、精确的、站点内容的深度复制。包括获取图像以及其他非文本内容。抓取并存储相关的内容。对内容来者不拒，不对页面进行内容上的修改。重新爬行对相同的URL不针对先前的进行替换。爬虫通过Web用户界面启动、监控、调整，允许弹性的定义要获取的URL。<br />
二者的差异：<br />
Nutch 只获取并保存可索引的内容。Heritrix则是照单全收。力求保存页面原貌<br />
Nutch 可以修剪内容，或者对内容格式进行转换。<br />
Nutch 保存内容为数据库优化格式便于以后索引；刷新替换旧的内容。而Heritrix 是添加(追加)新的内容。<br />
Nutch 从命令行运行、控制。Heritrix 有 Web 控制管理界面。<br />
Nutch 的定制能力不够强，不过现在已经有了一定改进。Heritrix 可控制的参数更多。</p>
]]></content:encoded>
			<wfw:commentRss>http://amberlife.net/2011/12/%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0%ef%bc%8dnutch-%e5%92%8cheritrix%e7%9a%84%e5%8c%ba%e5%88%ab%e5%92%8c%e8%81%94%e7%b3%bb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>搜索引擎lucene + heritrix读书笔记</title>
		<link>http://amberlife.net/2011/12/%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8elucene-heritrix%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0/</link>
		<comments>http://amberlife.net/2011/12/%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8elucene-heritrix%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 15:25:09 +0000</pubDate>
		<dc:creator>amberlife</dc:creator>
				<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://amberlife.net/?p=355</guid>
		<description><![CDATA[索引文件格式： .fnm格式：包含Document中的所有field名称 .fdt格式： 用于存储具有Store.YES属性的field的数据 .fdx格式：是一个索引，用于存储Document在.fdt的位置 .tis格式：用于存储分词后的词条 .tii格式：是.tis对应的索引文件，标明每个.tis文件中的词条的位置 .cfs 复合索引格式. 当IndexWriter的属性useCompoundFile为true时，就是使用复合索引格式来保存索引。 索引建立过程中的关键组件：IndexWriter， IndexReader，IndexModifer]]></description>
			<content:encoded><![CDATA[<p>索引文件格式：</p>
<p>.fnm格式：包含Document中的所有field名称</p>
<p>.fdt格式： 用于存储具有Store.YES属性的field的数据</p>
<p>.fdx格式：是一个索引，用于存储Document在.fdt的位置</p>
<p>.tis格式：用于存储分词后的词条</p>
<p>.tii格式：是.tis对应的索引文件，标明每个.tis文件中的词条的位置</p>
<p>.cfs 复合索引格式. 当IndexWriter的属性useCompoundFile为true时，就是使用复合索引格式来保存索引。</p>
<p>索引建立过程中的关键组件：IndexWriter， IndexReader，IndexModifer</p>
]]></content:encoded>
			<wfw:commentRss>http://amberlife.net/2011/12/%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8elucene-heritrix%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

