今天研究了一下午,终于初步搞定了,由于前天用MATLAB写了篇小作业,发现MATLAB在定义矩阵和数组,以及矩阵和数组运算上,感觉太方便了,而且速度有点带感,所以我一直想了解R与数值计算的专家MATLAB的交互使用,总结如下:
1.首先,我们来看看MATLAB调用R,由于蛮多人喜欢MATLAB编程的,当然我不提,也从不知道MATLAB中什么工程作图,什么SIMULINK(这个我以后我看看,貌似蛮多人提到)该怎么弄,我单就完成一份数据分析,建立统计模型相关的功能而使用MATLAB.
毋庸置疑,喜欢MATLAB的人也想从丰富的R包中调用各种函数,我们下面来看看怎么实现:
1)MATLAB 2013a)(我装了3个小时。。)运行没问题(其他版本没有尝试)
2)R多少以上不记得了,反正R.3.0.0绝对没问题
3)由于原作者发明这个方法是在2004年,当时他开发的rcom应该旧了,所以不太行,于是我从各种问题回复中一个个看,发现需要这个东西:
http://rcom.univie.ac.at/download/current/statconnDCOM.latest.exe
也是需要什么DCOM的,我印象中COM这个词组蛮常见的,应该是系统什么之类,估计又要涉及到汇编啊什么的(这个,我以后也想了解了解,不过感觉很难啊。。)
4)下载
http://www.mathworks.com/matlabcentral/fileexchange/5051-matlab-r-link
中的MATLAB R-link
5).会用matlab的人都知道,把上面下的文件解压后放到matlab的工作路径中去。那里有各种函数,这些函数就应该是怎么具体调用R了
6).当然R要在系统的path变量中
7).如果你成功了,在matlab中打下Rdemo(这其实就在那些m文件中,可能原理就是,在matlab中调用这个Rdemo函数,然后这个Rdemo呢又去从R的内置demo里面取东西出来,如果成功了,也就说明matlab可以调用R了)
8).具体怎么用大家可以去4)中的网址去查,下面搬运一些概要:
Description A COM based interface that allows you to call R functions from within MATLAB. The functions are:
openR - Connect to an R server process.
evalR - Run an R command.
getRdata - Copies an R variable to MATLAB.
putRdata - Copies MATLAB data to an R variable.
closeR - Close connection to R server process.
Rdemo - An example of using R from withing MATLAB.
SO,我们举个例子吧:
<br />
>> openR;<br />
>> a=1:9;<br />
>> putRdata('a',a)<br />
>> evalR('output=mean(a)')<br />
>> getRdata('output')</p>
<p>ans =</p>
<p> 5
更深的感兴趣的可以去尝试,不过我没有更深入尝试,因为我更喜欢下面的方法:
2.用R调用MATLAB,这回大家都笑了,我也笑了,真的。。貌似我运气蛮好,刚接触这个东西的时候(也就是想用R调用MATLAB的时候,最近就出方法了,那些几年前就接触R接触MATLAB,也有这个想法的亲们,你们久等了)
好吧,怎么做呢?
1)我们需要同R.3.0.0,matlab 7.0.1左右的(2013什么的我没试,原因在于下面的方法,貌似是系统自动找的我的matlab,而我有2个版本,一个7.0.1,一个2013,我不知道它用了哪个(呵呵,菜鸟的气质无法摆脱啊)
2)我们需要R.matlab,R.utils,R.oo这3个包
3)使用方法:
library(R.matlab)<br />
Matlab$startServer() #打开matlab,准备连接<br />
#[1] 0<br />
matlab <- Matlab()<br />
isOpen <- open(matlab) #连接matlab<br />
isOpen<br />
#[1] TRUE<br />
evaluate(matlab, "A=1+2;", "B=ones(2,20);") #在R中让MATLAB做事<br />
data <- getVariable(matlab, c("A", "B")) # 取结果,我也不知道下面的警告怎么去掉。。。<br />
#Warning message:<br />
In readChar(con = con, nchars = nbrOfBytes) :<br />
can only read in bytes in a non-UTF-8 MBCS locale<br />
str(data)<br />
#List of 2<br />
$ A: num [1, 1] 3<br />
$ B: num [1:2, 1:20] 1 1 1 1 1 1 1 1 1 1 ...<br />
- attr(*, "header")=List of 3<br />
..$ description: chr "MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: Thu May 16 21:41:51 2013 "<br />
..$ version : chr "5"<br />
..$ endian : chr "little"<br />
ABCD <- matrix(rnorm(10000), ncol=100) #R中定义<br />
str(ABCD)<br />
setVariable(matlab, ABCD=ABCD) #送入MATLAB<br />
data <- getVariable(matlab, "ABCD")#再取回<br />
str(data)<br />
如果是传递函数呢
<br />
setFunction(matlab, " \<br />
function [win,aver]=dice(B) \<br />
%Play the dice game B times \<br />
gains=[-1,2,-3,4,-5,6]; \<br />
plays=unidrnd(6,B,1); \<br />
win=sum(gains(plays)); \<br />
aver=win/B; \<br />
");<br />
evaluate(matlab, "[w,a]=dice(1000);")<br />
res <- getVariable(matlab, c("w", "a"))<br />
print(res)<br />
哦,这个例子我想大家会激动万分,没错,我们看到的不是一个函数从MATLAB中调用出来为我大R所用,而是MATLAB巨大的自带函数库,啊!哦YEAH!不过我只是初步,不知道以后会出问题么,但这样想着,前景的真的很美好啊,R与MATLAB混合编程,[s:17]
最后简要说下原理,貌似是通过文件系统,用TCP/IP协议,然后R与MATLAB通过MAT文件交换数据。。(其实我也不懂。。。)
PS:介绍的两种都是单向的,但我兴致勃勃把双向的留到最后看的时候,也就是这个RMatlab包,结果发现只能在UNIX下使用。。。。。好吧,转向UNIX,是我一年内的奋斗目标。。
</p>