I showed earlier how to fit a Bayesian hierarchical model in R to estimate experimental parameters. Our main data analysis pipeline uses Matlab, and we’d like to integrate these two environments for the purpose of analysis.So how can you pipe your data from Matlab to R and back?

# Flat file communication

There are a variety of unofficial interfaces between Matlab and R – you can call R from Matlab on Windows via a COM extension, or you can spawn Matlab engines and manipulate .mat files in R – but the very simplest communication involves writing your data in flat files, and loading them on the other end.

The `csvwrite`

and `csvread`

functions in Matlab, and the corresponding `read.csv`

and `write.csv`

functions in R are really all you need. Be aware, however, that Matlab’s built-in CSV reading function doesn’t support headers or string variables. You can pick up this more fancy version from the Matlab File Exchange that does.

# Matlab side

Matlab allows you to run terminal commands using the `!`

operator, or the OS-specific `dos`

and `unix`

commands. Thus, to read some data, run an R script, then read back the data written by R is as simple as:

csvwrite('in.csv',[originaldat]); !R CMD BATCH /home/username/Documents/script.r dat = csvread('out.csv',1,1);

Matlab will block until R returns, so you don’t need to worry about asynchronous callbacks.

# R side

On the R side, you need a batch script that reads the data, transforms it, and then writes it back. For our previous example, this would look like:

rawdat <- read.csv('in.csv',header=FALSE) #Extract the data we need ms <- rawdat[,1] stds <- rawdat[,3] #Run the MCMC model library("rjags") library("coda") jagresult <- jags.model('slices.model',data=list('ms'=ms,'stds'=stds,'N'=length(ms)),n.adapt = 10000) thesamps <- coda.samples(jagresult,c('mu','tau','realmean'),n.iter=100000,thin=10,progress.bar="gui") #Capture and dump to out file data <- data.frame(summary(thesamps)) write.csv(data,'out.csv')

And that’s pretty much all there is to it. You can use a similar process to call Python from Matlab. See also this post about reading pickle files in Matlab.

## One response to “Calling R from Matlab – flat file communication”

[…] Calling R from Matlab – flat file communication […]