суббота, 7 мая 2016 г.

Из R в Matlab и обратно



Мои коллеги пишут свои задачи на разных инструментах, а хочется связать всё какую-то единую систему, чтобы не обмениваться файлами, а передавать данные непосредственно. Вот я и придумал пару нехитрых процедур, чтобы упростить обмен данными между скриптами R и Matlab.



Не мудрствуя лукаво создадим два файлика для R и Matlab. Чтобы передавать данные из R, просто представим их в привычном для Matlab виде и "прочитаем".

%%%%%%%%  getDataFromRScript.m %%%%%%%%%%
%   Функция позволяет запускать скрипт R и забирать результат его работы
%   
function [mat,status] = getDataFromRScript(script)
    [status, output] = system(['Rscript ',script]);%   Запустим скрипт R
    mat = eval(output);%   Интерпретируем резульат работы скрипта
end



#####  SimpleMatlabConnector.R ##########
# Функция возвращает вектор в коде матлаба
getMatlabVector <- function(vec){
  cat('[')
  for(i in 1:(length(vec)-1)) {
    cat(vec[i])
    cat(",")
  }
  cat(vec[length(vec)])
  cat(']')
}

#####
# Функция возвращает матрицу в коде матлаба
getMatlabMatrix <- function(mat){
  cat('[')
  
  for(i in 1:length(mat[,1])) {
    
    for(j in 1:length(mat[1,])) {
      cat(mat[i,j])
      if(j!=length(mat[1,])){
        cat(",")
      }
    }
    if(i!=length(mat[,1])){
      cat(";")
    }
  }  
  cat(']')
}

Теперь представим, что у нас есть скрипт R из которого нам надо передать данные в Matlab

source('SimpleMatlabConnector.R')
v <- 1:100
# Какие-то действия с вектором v
# Вернём результат
getMatlabVector(v)

В Matlab достаточно запилить что-то подобное
%% 
% Получим вектор из скрипта R
data = getDataFromRScript('example.R');
plot(data)


Это, конечно, не самый лучший способ т.к.
  • Rscript должен находиться в Path системы
  • нужно следить, чтобы любой другой вывод R-скрипта был подавлен
  • годится только для небольших объёмов данных
Однако, для многих задачек сопряжения этого достаточно и я доволен =)
А что касается передачи из Matlab в R, то всё может работать совершенно аналогично.

Все эти файлы есть у меня на GitHub

Картинка взята отсюда: http://cdn.skilledup.com/wp-content/uploads/2015/01/R-Program-vs-MatLab-Feature_1290x688_MS1-940x501.jpg

Комментариев нет:

Отправить комментарий