想跳舞的鲸鱼

邪恶的GFW,你就饶了我吧:(

2014-12-27

如何制作带投影的3D图

1Matlab
Matlab已经考虑到了制作带投影的3D图的需求,提供了专门函数,只需要用surfc/meshc代替surf/mesh即可。
如:
[X,Y] = meshgrid(-3:.1:3);
Z=peaks(X,Y);
figure;
subplot(2,2,1);surf(Z);
subplot(2,2,2);mesh(Z);
subplot(2,2,3);surfc(Z);
subplot(2,2,4);meshc(Z);
则得到:


2Mathematica
Mathematica没有像Matlab那样提供直接的函数带投影的3D图,因此需要一些技巧。

2.1、利用纹理
思路:生成函数的投影图后作为纹理植入3D空间,然后与函数图共同显示
peaks[x_,y_]=3(1-x)^2*E^(-x^2-(y+1)^2)-10(x/5-x^3-y^5)*E^(-x^2-y^2)-1/3*E^(-(x+1)^2-y^2)
xLim = 3.0;
yLim = 4.0;
zPos = -10.0;
p3D = Plot3D[peaks[x, y], {x, -xLim, xLim}, {y, -yLim, yLim}, PlotRange -> All]
con = ContourPlot[peaks[x, y], {x, -xLim, xLim}, {y, -yLim, yLim}, PlotRangePadding -> 0]
tex = Texture[con];
reg = {{-xLim, -yLim, zPos}, {xLim, -yLim, zPos}, {xLim, yLim, zPos}, {-xLim, yLim, zPos}};
vtc = {{0, 0}, {1, 0}, {1, 1}, {0, 1}};
c3D = Graphics3D[{tex, Polygon[reg, VertexTextureCoordinates -> vtc]}];
Show[p3D, c3D]




2.2、提取“等高线”的坐标
conPt = Append[#, zPos] & /@ con[[1, 1]];
conLn = Cases[con, Line[l_], Infinity];
con3D = Graphics3D[GraphicsComplex[conPt, conLn]];
Show[p3D, con3D]


投影目前只是“线划图”如果想得到上面那样的“渲染图”,需要将Line替换成Polygon,并用FaceForm着色。
这种方法需要对Graphics的结构有深入了解,而且由于Mathematica并没有公开Graphics的结构,其在不同版本间可能有变化,因此程序的兼容性并不好,不推荐。

2.3、将3D实体压成一个薄面
XY平面投影:
p3D /. Graphics3D[gr_, opts___] :>
  Graphics3D[{gr, Scale[gr, {1, 1, 1/5}, {0, 0, zPos}]}, opts]
此时XY平面的投影并不清晰,需要利用Mesh等对Plot3D进行调整后才有较好效果。

进一步,3个平面同时投影:
p3D /. Graphics3D[gr_, opts___] :>
  Graphics3D[{gr, Scale[gr, {1, 1, 1/5}, {0, 0, zPos}],
    Scale[gr, {1/100, 1, 1}, {-xLim, 0, 0}],
    Scale[gr, {1, 1/100, 1}, {0, -yLim, 0}]}, opts]


3MatlabMathematica解决方案的简单比较
乍看上去,Matlab的解决方案比Mathematica简单,但Mathematica由于提供了底层函数Graphics3D使得方法较为灵活,比如当需要3面投影时,Mathematica稍作扩展即可,我不知道Matlab是否能做到这一点。

4、需要改进之处
A、节2.1中的程序在Mathematica 9中运行良好,但在Mathematica 10中总是崩溃,需要进一步9
B、节2.3中的程序在XY平面的效果糟糕,难道一定需要“条带”有无其它方法

5、致谢
本文主要参考了StackExchange.comVitaliy KaurovMatariki两人的精彩答案,具体参见:
http://mathematica.stackexchange.com/questions/14863/placing-a-contourplot-under-a-plot3d/
我针对主题做了大量简化,主要是去除了调色等一系列细节,所以图形显得单调,而Vitaliy Kaurov做的图很漂亮喔!


修订2014-12-28:Plot3D加上MeshFunctions->{#3&},则节4中,B的问题就解决了,如下图所示:


修订2015-01-02:
1、为方便应用,peaks的定义用文本而不是图给出
2、提取点语句中应该是con[[1, 1]],误为con[1, 1]]


2014-12-21

从iCloud搞定Contact

背景:家里领导换手机,从Android的Moto X800换成iPhone 6。
   微信设计很好,只要更改一下link的移动号码即可。
   但通信录却无法转移,需要解决。

先是通信录的导出
moto x800太老了,甚至连91、豌豆荚这些流氓软件都无法安装!唉,一直不懂为何这些Android软件读一个通信录都非要把自己装在手机里!
还好,moto x800自带的contact有一个功能可以share,邮件发送通信录。

然后是通信录的导入
再强烈吐槽一下apple,都2014年了,ios也到了8.0版本,itunes居然还没有提供通信录的导入!比sony还封闭。
好在icloud提供了vcf的导入。但其格式与moto x800的格式、编码又完全不一致。只能动手写程序,再用工具转码,这才搞定。

2014-11-28

Excel中“条件统计”函数的简单小结

Excel中“条件统计”函数的简单小结

CountIf(依据区域,条件)
SumIf(依据区域,条件,数据区域)
AverageIf(依据区域,条件,数据区域)

根据“依据区域”每行内容是否符合“条件”,对数据区域进行Sum、Average计算


2009-10-06

从∑到∫

从∑到∫

前段时间看了木遥一篇极好的科普文章《长度是怎样炼成的》(http://blog.farmostwood.net/20.html)。当然,科普的对象最好懂点微分、积分。如果学过测度论,那简直可以当小品来看了。

看完后,突发奇想,\sum_{i=1}^{n}{x_{i} } \int_{a}^{b} f(y)dy,二者何其相似!∫完全可以看作是∑的推广。

在一般的理解中,\sum_{i=1}^{n}{x_{i} } 表示n个数相加,其中n是有限数,可以推广到“可数无穷”,但不能推广到“连续统”。
果真如此的话世界将变得如此简单,可惜,Riemann、Lebesgue找到了一条地狱之路:∫
不严格的令x_{i} =f(a+dy\cdot i)dy,则\sum_{i=1}^{n}{x_{i} } =\sum_{i=1 }^{n}[{f(a+dy\cdot  i)dy}] ,其中n=\frac{b-a}{dx} ,显然这里n是“连续统”!本来按照求和的规则,此式无法计算。但是\sum_{i=1 }^{n}[{f(a+dy\cdot  i)dy}] =\int_{a}^{b} f(y)dy,因此“连续统”个相加也是有意义的,即积分!
这样一来,Riemann积分的意义即为:利用Darboux和将“连续统”个数相加,“降级”成“可数无穷个”数相加。

上面只是个人的异想天开,未必正确,请大家不吝指正



2009-09-06

在Excel实现“列表”、“表格”的相互转换

1、前言
数据经常有“列表”、“表格”两种表现形式
列表形式:
Name    Value
张三    31
张三    32
……
李四    41
李四    42
李四    43
……
王二    21
王二    22
……
数据库就使用这种形式,但其Key有冗余。

表格形式:
Name    Value1    Value2    Value3    Value……
张三    31      32
李四    41      42      43
王二    21      22
这种形式Key没有冗余,但Value究竟有几个不好确定,会形成Sparse矩阵,不利于关系数学(矩阵)处理。

两种形式各有利弊,关键是能够随意转换。

2、“列表”→“表格”
2.1、VBA
VBA编程思路如下:
目标行指针Table_Row;
目标列指针Table_Column;
Table_Row=Table_Start-1
For(List_Row,List_Start,List_End)
  比较List_Row.List_Key、Table_Row.Table_Key
    如果相等:
      Table_Column+=1
    如果不等:
      TableRow+=1
      List_Key→[Table_Row].Table_Key
      Table_Column=1
  List_Data→[Table_Row,Table_Column].Table_Data。
Next List_Row

2.2、交互式操作
Key  个数n  起始行  结束行  地址  数据
其中:
Key:应该是唯一值,可以使用工具得到
个数:可以使用CountIf、DcountIf、Frequency、透视表得到
起始行:可以使用Match得到
结束行:可以使用Match得到,也可以使用起始行+个数得到
地址:Address(起始行,列,1)&":"&Address(结束行,列,1)
数据:Transpose(Indirect(地址))
注意:Transpose应该以最大n输入数组公式,然后删除NA
但这有一个后遗症,当n=1,数组形式的Transpose会形成n个重复,因此需要对n排序,对于n=1的,不用数组形式的Transpose

3、“表格”→“列表”
3.1、VBA
VBA编程思路如下:
List_Row=List_Start
For(Table_Column,Table_Start,Table_End)
  Table_Key→List_Key
  Table_Column.Table_Value→List_Value
  List_Row+=n
Next Table_Column

3.2、交互式操作
纵向选定ValueI,然后重复n次,当然,不能忘记同时复制n次Key

Excel中查询函数的简单小结

Excel中查询函数纷繁复杂,在此简单做个小结,防止遗忘

1、地址函数
Rows/Columns(区域),返回区域包含的行/列数
Row/Column(单元),返回单元是第几行/列

Address(行,列,$$|$R|R$|RR,R1C1|A1,Sheet),返回文本形式的地址
Indirect(文本形式的地址),返回引用
Offset(基点,行偏移,列偏移,高,宽),返回引用

2、返回符合条件个数的查询函数
Countif(区域,条件)
DCount(区域,列,条件)
Frequency(区域,界限数组)

3、返回值的查询函数
Lookup(值,单行/列区域),返回区域后面1行/列的值
Lookup(值,多行/列区域),返回区域最后1行/列的值
Hlookup(值,区域,结果在第几行,1精确|0近似)
VLookup(值,区域,结果在第几列,1精确|0近似)

4、返回位置的查询函数
Match(值,区域,类型),返回第几行匹配

5、依据位置的查询函数
Index(区域,行,列),返回单元格的内容

2009-05-29

再也不需要Vlookup+DataPilotTable,直接用Frequency!

Frequency(数据区域,区间数组)

注意:
是数组公式,应该用Ctrl+Shift+Enter

返回值长度为:
1:(-∞,L1]之间的数据个数
2:(L1,L2]之间的数据个数
……
n:(Ln-1,Ln]之间的数据个数
n+1:(Ln,+∞)之间的数据个数

2009-04-06

洗面乳为啥要先挤出洗面乳在手掌上,然后加水揉出泡沫,最后在脸上按摩?

前段日子,领导买了一瓶洗面乳送给俺,在仔细阅读说明后领导郑重其事的嘱咐:要先挤出洗面乳在手掌上,然后加水揉出泡沫,最后在脸上按摩!
俺当时没敢吱声,心里那个纳闷呐,好像俺从来就是先把脸打湿,再挤出一段洗面乳直接往脸上按摩,反正脸上有水,也能揉出泡沫啊。虽然百思不得其解,但也一直按我的老办法,没有按照厂家的推荐意见办。
今天我在洗澡时突然灵光一闪,终于找到了原因:这明明是厂家多卖产品的窍门嘛。
大家想啊,“先挤出洗面乳在手掌上,然后加水揉出泡沫”,这样得白白给水冲走多少洗面乳啊!又想起了牙膏厂为了多卖牙膏把管口扩大1.4倍的经典故事,因为大众早已经习惯了挤出一定长度的牙膏,这样一来,牙膏的消耗就是原来的两倍。
果然无奸不商啊!

2009-04-01

用VLookup实现编码

以前的工作经常需要对数据进行编码。所谓编码就是针对一个数据,用另外一个数据来表达。比如学生的成绩评定,90~100:优秀、80~89:良好、60~79:及格、0~59:不及格。这就是最简单的编码。可见编码是一件非常简单的事情,但它的用处非常大,这可是数字化的最基础手段!

编码虽然简单,但想在Excel中快速,简单的实现编码还是有许多技巧。

常用的是求商取整,但这种方法有以下缺点:
1)、区间间隔一致,无法实现变长区间
2)、只能实现数据到数据的编码,无法实现其他数据类型的编码

为了克服以上缺点,必须使用分段函数,但这又比较繁琐,今天使用Vlookup核对数据时,突然想到Vlookup可以较好的满足编码的需求,并有以下优点:
1)、简单方便
2)、区间间隔可以任意指定
3)、可以实现任意数据类型到任意数据类型的编码

下面是Vlookup的简单介绍。

VLOOKUP(lookup_value,table_array,col_index_num,range_lookup)

lookup_value:可以是数组喔,此时该公式就是数组公式,别忘记用Ctrl+Shift+Enter输入。

Table_array:一般至少为两列数据。
其中第1列中的值是分界点,相当于[M1, M2),[M2, M3),……,[Mn-1, Mn)
注意:
M1必须是可能值中的最小值,否则一旦lookup_value小于M1,Excel会返回#N/A
Mn不必是可能值中的最小值,即使lookup_value大于Mn,Excel也会定位到Mn所在行

col_index_num:table_array中待返回的匹配值的列序号,该序号从1开始
注意:
col_index_num不得小于1,否则Excel返回错误值#VALUE!。
col_index_num不得大于table_array的列数,否则Excel返回错误值#REF!。

Range_lookup为逻辑值
如果为TRUE或省略,则返回精确匹配值或近似匹配值。
table_array第一列中的值必须以升序排序;
此时如果找不到精确匹配值,则返回小于lookup_value 的最大数值。

如果为FALSE,Excel将只寻找精确匹配值。此时table_array第一列的值不需要排序。
如果table_array 第一列中有两个或多个值与lookup_value匹配,则使用第一个找到的值。
如果找不到精确匹配值,则返回错误值 #N/A。

2009-03-31

Excel中Pearson与CorRel的区别

今天无意中发现Excel中除了Pearson,还有CorRel!二者究竟有何区别?Excel的Help含糊不清,没有发现有价值的提示信息。

google了一圈,终于在http://support.microsoft.com/kb/828129/zh-cn发现了权威的答复。

在>=2003版本中,Pearson与CorRel相同
在<2003版本中,Pearson与CorRel不同

在早于2003的Excel版本中,PEARSON可能会出现舍入错误,该缺陷在2003及更高版本的Excel中得到了改进。

CORREL总是通过这种改进的过程来实现。

2009-03-28

简单相关系数并不简单

写这篇文章,源于pinggu.org上cathy_wxh关于“相关系数及其显著性水平”的求助贴,在与xmok77的讨论过程中,我发现自己对此仍有不少概念仍然不够清楚,需要澄清,因此萌发了写此文的念头。好,下面言归正传。

相关系数有很多种,如Pearson积差相关、Spearman等级相关、Kendall等级相关、Kendall和谐系数、Kappa一致性系数……,最常用的当然是Pearson积差相关系数,又称为简单相关系数,但它可不简单喔!

1、r的计算
首先复习一下有关知识:
总体参数协方差σxy=E{[X-E(X)][Y-E(Y)]}
总体参数相关系数ρxy=σxy/[sqrt(σxx)*sqrt(σyy)]
统计量样本协方差sxy=sum[(Xi-x)(Yi-y)]/(n-1)
统计量样本相关系数rxy=sxy/[sqrt(sxx)*sqrt(syy)]
当X、Y都服从正态分布时,ρxy常用rxy进行估计。

2、r的意义
相关关系不代表因果关系。
Pearson相关系数只反映线性相关程度,不反映曲性相关程度。
不少书上都谈到了相关系数的几何意义,但都没有谈透,我自己觉得Pearson相关系数反映了“散点向线段聚集”的程度。当然还有许多其它意义,我还想对此做进一步的探索。

3、r的分布
r究竟符合什么样的分布,我看到的教科书上都没有明确的答案,只是给出了两个检验方法,这在后面还会详细讲解。于是我试图自己推导,但高等数学早就忘得差不多了,实在无法进行。恰在此时,verycd.com上居然发布了Crystal Ball V11!简单的学习后我异想天开,利用Monte Carlo模拟对r的分布进行数值计算!其中遇到了不少困难,但都找到了解决办法,这不是本文的重点,以后我或许会写一篇关于Crystal Ball的介绍。下图是我的工作界面,相信对Crystall Ball熟悉的朋友一下就明白了。

这里简单解释一下大概的流程。
1)、对正态总体X抽样,得到容量为30的样本,将之作为Monte Carlo模拟的假设Assumption。
设定X01~X30共30个相互独立的随机变量,Xi~N(μx、σx^2),这里μx、σx具体是多少并不重要。
2)、对正态总体Y抽样,得到容量为30的样本,将之作为Monte Carlo模拟的假设Assumption。
设定Y01~Y30共30个相互独立的随机变量,Yi~N(μy、σy^2),这里μy、σy具体是多少并不重要。但注意对于每个Yi一定要设定它与Xi的相关系数为ρ。
3)、计算r,将之作为Crystal Ball的预测Forecast。
为了方便,可以同时计算r(n=2)、r(n=3)、……、r(n=30)
4)、Run the Model!

经过反复试验,我发现r的分布应该取决于总体参数ρ和抽样次数n。下图是进行100000次Monte Carlo模拟后,再用ImageMagick拼接后得到的结果:

ImageMagick网上有不少介绍,在此不再赘述,有兴趣的朋友google一下吧。

可惜的是Crystal Ball的绘图功能有限,只能定制X轴,无法定制Y轴,因此需要注意这些子图的X轴范围是一样的,都是-1~+1,但Y轴的范围都不太一样。但这无关大局。

从图中有几个有趣的地方:
1)、当n=2时,无论ρ是多少,r只能取±1,随着ρ由0→1,r取得1的概率逐步增加,取得-1的概率逐步减少。
2)、当ρ=0时:
  当n=3,则r以很大的概率取得接近±1的值,取得0的概率反而很小。
  当n=4,则r取得[-1,+1]之间任何数的概率都相等。
  当n由5→+∞,r取得0的概率逐步增加,r也越来越象正态分布
3)、当n<10时,r的分布距离ρ实在太散,即如果用计算得到的r来估计ρ的话风险太大。>10时,r的分布距离ρ较为集中,即如果用计算得到的r来估计ρ的话风险较小。
5)、在同样的n下,当ρ由0→1,相应的r的分布也会越来越集中。
6)、当ρ=0时,r的分布左右对称;
  当ρ>0时,r的分布左偏;
  当ρ<0时,r的分布右偏。 r="1,因此图中没有画出ρ=" n="400!(我坚决不愿做Pearson的助手:))。计算结果从最乐观的角度看也只是证明r的分布实在离正态分布太远。">3时就可以较好的接近正态分布!(看样子我也做不了Fisher的助手:))。

3、r的检验
从前面可以看出,r似乎不遵从常见的概率分布,其偏离期望值ρ的程度很高,这就很好的解释了为什么教材书上格外强调对r需要进行显著性检验。
回想一下,当用样本平均值、样本方差这些统计量去估计总体均值、总体方差这些总体参数的时候可没有特别强调进行显著性检验。理由很简单:
如果总体X~N(μ、σ^2/n),则样本平均值~N(μ、σ^2/n);
如果总体X~N(μ、σ^2/n),则样本方差有(n-1)s^2/σ^2~χ^2(n);
这些分布的偏差都不是太大,因此常常被忽略,当然严格意义上讲这是不正确的,对于每个估计,都应该进行显著性检验。
那么,如何对其进行检验?

1)、t分布法
有人(我没有查到到底是哪位大牛,希望知道的朋友告诉我)发现当ρ=0时,r/sqrt[(1-r^2)/(n-2)]服从t(n-2)分布。
对此同样利用Crystal Ball进行100000次Monte Carlo模拟,再利用ImageMagick拼接,得到下图:

从直觉看似乎的确符合t的特点。

2)、z法/f法
Fisher发现若令z=ln(sqrt((1+x)/(1-x))),则z(r)~N(z(ρ),1/n-3)。即[z(r)-z(ρ)]/sqrt[1/(n-3)]~N(0,1)。Fisher将之称为z分布,后人为表彰Fisher,将之称为Fisher分布!
对此同样利用Crystal Ball进行100000次Monte Carlo模拟,从直觉看,似乎的确如此。大家对正态图实在太熟悉了,这里就不再贴拼接图了。:)好好,我坦白,其实是我想偷懒还不行嘛。

这里再多说两句,绝大多数教材上都说,对于Pearson相关系数:一般先利用t方法进行“线性相关显著性检验”,如果相关不显著,则不管其相关系数r多大,都认为其不可接受,即认为ρ=0。
我想,应该也可以利用Fisher方法对其进行检验?即利用[z(r)-z(0)]/sqrt[1/(n-3)]~N(0,1),不知是否正确,还请达人对此指正。

2009-03-22

用Excel生成二维函数曲面图

今天看到有人询问如何用Excel生成二维函数曲面图,或者用什么软件生成

用Octave/Matlab、Mathematica、Maple这些数学软件当然可以方便的画出二维概率密度函数图。

用Origin、Sigmlot这些半专业的科学图形软件当然也可以方便的画出二维概率密度函数图。

绝大多数人认为Excel无法生成二维函数曲面图,其实Excel当然也可以,只是繁琐一些,效果差一些而已。

步骤如下,

1、必须有一系列(x, y)向量值

2、将之code到区间上,比如[0.0~0.1)→0,[0.1~0.2)→1……[0.9~1.0)→9

3、利用透视表得到一张二维表格

4、根据这张二维表格,插入“曲面图”

在Excel2007中试验成功,效果可以见下图:



2009-03-18

如何提出Ho真是一门学问

今天上cos.name看到2008年统计学考研真题第四题“食品厂家说:净含量是每袋不低于250g。但有消费者向消协反映不是250g,消协据此要求厂家自检,同时消协也从中随机抽取20袋检验”

(1)如果厂家自己检验,你认为提出什么样的原假设和备则假设?并说明理由。
(2)如果从消费者利益出发,你认为应该提出什么样的原假设和备则假设?并说明理由。

我想:拒绝Ho是不容易的,因为必须p<α。所以厂家基于自己的利益应该提出:
Ho:weight ≥ 250g;
Ha:weight < 250g。
这样的话,即使实际测量得到的Weight<250,如果短斤少两不是很厉害的话,也无法拒绝Ho。

当然,消费者基于自己的利益就应该提出:
Ho:weight < 250g;
Ha:weight ≥ 250g;

但郑冰认为:
假设检验的主要目的是为了拒绝,所以厂家要说明自己的产品合格得拒绝原假设
因此应该提出:
H0:weight < 250g;

谢益辉认为:
1、厂家会说,不拒绝又不表示接受,因此消费者如果提出H0:weight < 250g则力度不够。
2、从是否容易拒绝零假设的角度来看,厂家提出weight ≥ 250g的确占点便宜。

仔细想想应该这样说:
食品厂家对于计量是否准确,心里是有数的。

如果确实不短斤少两,食品厂家则按郑冰的做法,提出以下假设:
Ho:weight = 250g;
Ha:weight > 250g。
这样可以非常有力的消除消费者的怀疑。

如果确实少上一点,食品厂家则按我的做法,提出以下假设:
Ho:weight = 250g;
Ha:weight < 250g。

如果少得比较厉害,食品厂家还是及早承认错误吧。

不知这样解决如何?

MindManager 2008终于可以将.mmap直接转换成.swf文件了

MindManager 2008终于可以将.mmap直接转换成.swf文件了!

搞笑的是,无论是Save As的菜单栏中还是Export的菜单栏都没有直接的选项,必须到了Save As的对话框中,在保存类型中才有.swf文件类型,真让人好笑。真可谓“千户万换始出来,犹抱琵琶半遮面”。

不管如何,终究是一件好事,可惜blogger.com还是不支持上传.swf

2008-12-16

Matlab R2008启动时崩溃的解决方法

前段时间安装了MatLab R2008a和R2008b,在启动时都崩溃,说什么“Application Failed to Initialize Properly (0xc00000005)”,开始以为是系统的问题,重装系统也无济于事,无奈,Google。

哈,原来别人也中招了!

Matlab在启动时试图保护0x50000000到0x70000000的内存,但如果其它程序已经占据了此段内存,错误就不可避免。

有人给出了解决方法:
1、在快捷方式中加“-shield none”参数。
2、不用 "C:\Program Files\Matlab\R2008b\bin\matlab.exe",改用"C:\Program Files\Matlab\R2008b\bin\Win32\matlab.exe"。

写文章时,有查了一遍,发现此问题已经作为官方正式承认的问题,希望在2009a中该问题不再出现。

2008-12-14

R的GUI

据说R是一种优秀的自由统计软件,完全可以取代S-Plus、Statistics、SPSS等软件,更不用提MiniTab、JMR等。

miniWhale尝试了一下,感觉R没有GUI,只有console的方式对于非专业人员有点吃力。网上居然有人还宣称“这显示了R的先进性”,实在让人无语。

Google了R的GUI,发现有许多选择:

1、Rcmdr
R Commander,类似于SPSS等。
安装方法如下:启动R,在Console中输入install.packages("Rcmdr"),然后再输入library(Rcmdr),R会提示还需要安装相关的packages,同意即可。最后的界面如图所示:


2、Tinn-R
非常小巧的R文件编辑器,可以直接将语句或文件发给R。直接看图吧:


3、JGR
Java GUI for R,未深入研究,似乎与原始的R区别不大,只不过把命令区与响应区分成上下两个部分。如下图所示:


4、RWinEdt
喜欢tex的有福了。RWinEdt依赖WinEdt(这是CRAN的非GPL软件喔)。注意WinEdt只是编辑器,MiKTeX、TeX Live才是Tex System。
安装时注意要先安装WinEdt,其界面如下:

然后再install.packages("RWinEdt"),最后再输入library(RWinEdt),则RWinEdt会在WinEdt的基础上生成新的界面如下:


5、Eclipse + StatET
Eclipse还用说吗?没想到居然还有R的插件。

6、RKWard
RKWard是KDE下的图形界面。

7、ESS
Emacs Speaks Statistics,熟悉Emacs的人无疑会喜欢它。

8、pmg
老套路,先install.packages("pmg"),再library(pmg)。注意需要安装gtk。界面如下图所示:


9、SciViews
不知何故,SciViews.org犯了天条,被GWF了。

从简单的个人体验看,Rcmdr、PMG、Tinn-R是较适合的选择。

2008-10-22

终于可以不用无休止的升级Messenger了

偶尔会用messenger,但很反感它的强迫升级,尤其鄙夷它对动态头像、下载图片这样的功能都要收费。

好了,Microsoft推出了webmessenger.msn.com,可以用浏览器使用messenger了,再也不用烦这些事了。

当U盘从4GB变成了16GB

一直喜欢U盘而不是光盘作为启动工具盘,原因很简单:体积小,携带方便(不幸的是遗失也方便,miniWhale已经丢了7、8个了),还不用总是携带外置式光驱,修改方便,copy资料也方便,完全能够“挥棒走天涯”。:)

原来一直使用4GB的Aigo,前几天,花240大洋出手败了个Apacer的16GB钢铁侠,序列号是AP16GAH321R。没有意料到居然由此引发了一系列问题……

在4GB的U盘上,miniWhale用FlashBoot建立了FreeDOS(2个文件,1MB都不到)系统,然后copy了一个Ghost。这样,用这个U盘就可以启动到DOS环境并运行Ghost,完成系统的备份和还原,非常方便。

当miniWhale如法炮制16GB的U盘上时,出现了意想不到的问题:由于DOS只支持FAT 16,而其极限容量为4GB(许多资料称FAT 16的极限容量是2GB,但NT 3.51起就支持4GB)。这样一来,只好放弃DOS。

WIndows支持FAT 32,而据称其极限容量为2TB,而且还有Ghost32可用。miniWhale兴冲冲的运行Bart的PE Builder 3.1.10.a,然后用PE to USB 3.0.0.7将之转移到U盘上。可惜,在16GB的U盘上根本无法启动;在4GB的U盘上可以正常启动,也可以运行Ghost32,但界面实在不行,尤其是所有的中文都成了乱码。

考虑分区吧,令人实在疑惑的是Windows居然无法给U盘分区。使用HP的Format工具,Format功能很好很强大,但也无法分区。使用HP的Drive Key Boot Utility,依然无法奏效。google了一下,发现需要使用ChipGenius察看USB控制芯片信息,再用厂家的量产工具改变。但AP16GAH321R很新,找不到相关信息。找了一个友联的量产工具似乎也不好使。

难道能使用4GB的U盘做启动盘?!天无绝人之路,最后的希望落在了Linux!

下载CloneZilla,将只解压到用FAT32格式化的U盘上,执行其自带的makeboot。然后测试,一切OK!

故事本该到此结束的,但miniWhale想更进一步,干脆在U盘上安装ubuntu,从而释放硬盘空间。

使用ubuntu 8.04.1 LiveCD(惊讶的是wubi居然不支持U盘安装)轻松的把U盘分成两个区!第一个为Ext2安装Ubuntu,第二个为FAT32存放数据。
注意几个要点:
1、ubuntu不支持把FAT32挂载成/,而Ext3是日志文件系统,对U盘读写太频繁,而U盘的读写次数是有极限的,所以用Ext2较好。
2、不要使用SWAP,首先miniWhale小黑的内存有2GB,足够ubuntu使用了;其次减少U盘读写以延长其寿命。
3、在向导的最后一步,有一个高级选项,在那里选择把Grub安装到/dev/sdb即U盘上。否则会自动安装到hd0即硬盘上,这样不符合miniWhale所谓“无侵入”的要求,每次开机都会询问选择哪个系统启动,把相关U盘信息写入了硬盘;更重要的是这样一来,在其它无Grub或无适当配置的机器上就应该无法以此U盘启动(未验证),不符合“挥棒走天涯”的精神。:)

完成安装后,在Windows下居然出现了2个问题:
1、Ubuntu不能启动!Grub提示Error 15。
2、Windows不认U盘!

由于过去一次安装Windows XP的不愉快经历,miniWhale猜想从CD或硬盘启动时,内置硬盘是hd0即/dev/sda,而U盘则是hd1即/dev/sdb,但当从U盘启动时,内置硬盘是hd1即/dev/sdb,而U盘则是hd0即/dev/sda。果然,当miniWhale按“e”进入修改菜单内容,将hd1修改成hd0后,美丽的handy heron轻盈的飞上了桌面。

第2个问题实在令人费解。内事不绝问老婆,外事不绝问Google!特意指定了搜索ubuntu.org.cn,果然,论坛中billBear非常明确:“win对待u盘的方式很古怪,在xp下用系统自带工具是怎么也不肯给u盘分区的;而用其他操作系统分好区的u盘,xp和vista总是只使用其第一个分区,dos(以及据说win 98)倒是可以使用所有分区。”解决方案就这么简单,只需要将FAT32数据分区放在第1,Ext2系统分区放在第2就可以了。

好了,剩下的就应该是安装Clonezilla软件了。

2008-10-19

让Mathematica中的大括号、中括号自动调整

今天miniWhale发现用Mathematica中的Basic Typersetting输入类似方程组前的大括号时,它不会自动延伸到适当大小,以包住所有的行。如下图所示:


而矩阵的()则可以自动延伸到适当大小以包住整个矩阵,如下图所示:


在Word 2007中试验了一下,它的公式编辑器是可以的,如下图所示:


miniWhale翻阅了一下《Tour of Mathematica》,发现用StyleBox[……, SpanMaxSize -> Infinity] // DisplayForm可以解决这个问题。

1、有关Low-Level Notebook Structure的概念
Notebook[ {cell1, cell2, ……}]
Cell[内容, 格式]
RowBox[ {box1, box2, …} ],构建1行
GridBox[ { {box11, box12, …}, {box21, box22, …}, … } ],构建1表
SuperscriptBox、SubscriptBox、SubsuperscriptBox[主体, 下, 上],上下标
OverscriptBox、UnderscriptBox、UnderoverscriptBox[主体, 下, 上],正上下标
FractionBox[分子, 分母],分数
SqrtBox[主体]、RadicalBox[主体, 方],根号

StyleBox[boxes, options],设置选项
StyleBox[boxes, "格式"],设置选项

FrameBox
AdjustmentBox

FormBox
InterpretationBox
TagBox
ErrorBox

由于函数名字已经很好的暗示了其功能,这里不再赘述。

2、StyleBox与自动垂直延伸相关的选项
选项
默认值
备注
SpanMinSizeAutomatic垂直可延字符的最小高度
SpanMaxSizeAutomatic垂直可延字符的最大高度
SpanSymmetricTrue是否对称延伸
SpanLineThicknessAutomatic 是否自动粗细

但是,小括号()永远自动垂直延伸。

4、解决方案
有了上面的知识,可以解释为啥矩阵可以自动被包围,而大括号、中括号却不行。当然,要解决这个问题也很简单,就是用StyleBox[……, SpanMaxSize -> Infinity] // DisplayForm。
下面是一个实例:
StyleBox[RowBox[{ "{",
GridBox[{ {AAA}, {BBB}, {CCC}, {DDD}, {EEE} }]}] ,
SpanMaxSize -> Infinity] // DisplayForm

3、其它
遗憾的是,Word中调好的公式copy到Mathematica中,仍然不能正确显示;同样,Mathematica中调好的公式copy到Word中,也不能正确显示。
前一个问题容易解决,就是在Mathematica中,按Shift+Ctrl+E,相当于ToBoxex,在代码里修改即可。

miniWhale原创

Excel中数组公式的摘要

好久不用数组公式,居然忘记了,赶紧整理一份简单的摘要

1、数组的概念与表达
数组有两种类型:常量数组、区域数组:


常量数组区域数组
1维水平{元素1, 元素2, ……, 元素r}Am:An
1维垂直{元素1; 元素2; ……; 元素r}aN:bN
2维{ ……}
形状必须为矩形,即:
各行的长度必须相同
各列的长度必须相同
am:bn
注意分割符与MatLab相似,逗号分列,分号分行。
元素只能是常量,不能是引用、名称、公式。
同一个数组内的元素常量可以是不同类型的常量,
如:文字、数字、布尔等。
a、b代表列号
m、n代表行号
若r<s<t,则Xr:Xs:Xt≡Xr:Xt
若a<b<C,则aN:bN:cN≡aN:cN

2、数组公式

2.1、概念
将数组就像单个值一样代入公式。

2.2、输入
先选择好结果区域,输入完数组公式,最后用Shift+Ctrl+Enter输入。

2.3、运算
其记法与线性代数不同,与MatLab相似。运算规则如下:

记号:
k是常数;
K是由k组成的m×n数组;
A、B是m×n数组;
┃是m×1数组;
━是1×n数组;
C是由┃沿水平方向重复n次组成的数组;
D是由━沿垂直方向重复m次组成的数组;

则:
A+B、A-B、A*B、A/B相当于Matab里的A.+B、A.-B、A.*B、A./B;
A+k、A-k、A*k、A/k相当于Matab里的A.+K、A.-K、A.*K、A./K;
A+┃、A-┃、A*┃、A/┃相当于Matab里的A.+C、A.-C、A.*C、A./C;
A-━、A-━、A*━、A/━相当于Matab里的A.+D、A.-D、A.*D、A./D;
其他函数与之类似。

注意:
这里的乘法与教科书上的标准的矩阵乘法并不相同。
Excel中用MMult函数实现教科书上的那种标准的矩阵乘法

3、其他
其实,某些常用函数已经使用了数组,如Sum、Max、Min、Index等,但其返回值是单个值,所以除了用Shift+Ctrl+Enter,还可用Enter直接输入。但如果返回值是数组,则必须用Shift+Ctrl+Enter输入。
另外,如果用Ctrl+Enter也可输入,但这是填充!