2016-12-07 3 views
1

Я пытаюсь импортировать файл Matlab в R для некоторого анализа. Файл Matlab представляет собой трехмерный позиционный массив значений вероятности. Итак, его матрица 2D (x, y) через z "срезы". То, что я хотел бы сделать, это преобразовать это в R-файл с «местоположением», а затем с сообщенной вероятностью. Так что-то вдоль линий ниже как выход:Импорт 3D-массива из Matlab в R

Prob x y z 
0.17 1 1 1 
0.28 1 1 2 
0.35 2 1 1 
0.40 2 1 2 
0.16 1 2 1 
0.27 1 2 2 
0.34 2 2 1 
0.80 2 2 2 

Когда я использую пакет R.matlab я могу импортировать данные, и, как представляется, импорт штраф, но я не могу показаться, чтобы получить " размеры "данных или делить его на разные матрицы ... или действительно делать что-нибудь полезное, но иметь его как длинный« список »значений, который представляет собой длину столбцов * столбцов *.

Ниже несколько примеров кода:

Matlab код

x = rand(3,4,2) 
save file.mat x 

R Код

Tdata <- readMat("file.mat") 
    head(Tdata) 
    str(Tdata) 
    length(Tdata$x) 

Какие выходы

> str(Tdata) 
List of 1 
$ x: num [1:3, 1:4, 1:2] 0.026 0.330 0.222 0.631 0.567 ... 
- attr(*, "header")=List of 3 
..$ description: chr "MATLAB 5.0 MAT-file, Platform: GLNXA64, Created on: Mon Dec 5 17:45:33 2016          " 
..$ version : chr "5" 
..$ endian  : chr "little" 

> length(Tdata$x) 
[1] 24 

Так это показывает, что TDATA является единственным элементом список, содержащий массив с тремя измерениями, и каждое измерение правильное, и оно имеет правильное общее количество значений, но я не могу выделить какой-либо из этих списков или определить их размеры с помощью функций length() или dim(). Первоначально я думал о том, чтобы использовать что-то вроде ниже, но потому, что я не могу получить размеры, которые, похоже, не работают.

ndim <- dim(Tdata) 
x_coord <- c(1:ndim[1]) 
y_coord <- c(1:ndim[2]) 
z_coord <- c(1:ndim[3]) 
    new_df <- expand.grid(x_coord,y_coord,z_coord) 
    new_df <- cbind(new_df,Tdata$x) 

Любая помощь будет оценена!

+0

Если вы используете Octave в качестве посредника, 'foreign :: read.octave' может читать в массиве напрямую. – alistaire

+0

Итак, я пробовал читать файл .mat в файле read.octave («file.mat»), и я получаю эту ошибку: Ошибка в коммутаторе (тип, matrix = read_octave_matrix (con), scalar = read_octave_scalar (con),: EXPR должен быть длиной 1 вектором Затем я попытался прочитать файл с данными <- readMat ("file.mat"), а затем прочитал эти «данные» с помощью read.octave (data). Затем я попытался преобразовать «данные «для массива и чтения этого с помощью read.octave. Ни один из них не работал. Что я делаю неправильно? – Nathan

+0

Хорошо, я обновлю текст, чтобы это отразить. Спасибо. – Nathan

ответ

2

Для отображаемого объекта Tdata вы попадаете в массив с Tdata$x или Tdata[[1]]. К сожалению, я не знаю ни одного эквивалента матричным функциям row и col. Вы можете построить индексы с серией вложенных rep -коллекций.

rows = rep(rep(1:dim(arr)[1], each=dim(arr)[3]), times=dim(arr)[2]) 
cols= rep(rep(1:dim(arr)[1], each=dim(arr)[3]), each=dim(arr)[2]) 
instances= rep(rep(1:dim(arr)[1], times=dim(arr)[3]), times=dim(arr)[2]) 

Тогда это возвращает объект (будем надеяться, но непроверенный в отсутствие примера, представленного с dput -output.)

data.frame(Prob = Tdata$x, x=rows,y=cols, z=instances) 

Существует functiuon, который генерирует dataframes с строки, содержащие уникальные комбинации, но вы должны были бы назвать его с lableing, которые могут появиться менее интуитивное:

> expand.grid(z = 1:dim(arr)[1], x = 1:dim(arr)[2], y = 1:dim(arr)[3]) 
    z x y 
1 1 1 1 
2 2 1 1 
3 1 2 1 
4 2 2 1 
5 1 1 2 
6 2 1 2 
7 1 2 2 
8 2 2 2 

Старый ответ, основанный на неправильном понимании вопроса:

My rd.txt Функция просто устанавливает чтение.аргументы таблиц для чтения из текста с заголовком, чтобы сделать dataframe (и я сделал это до того, как text -argument был создан для read.table):

> arr <- array(NA, c(2,2,2)) 
> df <- rd.txt("Prob x y z 
+ 0.17 1 1 1 
+ 0.28 1 1 2 
+ 0.35 2 1 1 
+ 0.40 2 1 2 
+ 0.16 1 2 1 
+ 0.27 1 2 2 
+ 0.34 2 2 1 
+ 0.80 2 2 2 
+ ") 

Теперь, используя метод матричного индекса для решения местоположения в массиве (или чаще матрица):

> arr[ as.matrix(df[-1]) ] <- df[[1]] 
> arr 
, , 1 

    [,1] [,2] 
[1,] 0.17 0.16 
[2,] 0.35 0.34 

, , 2 

    [,1] [,2] 
[1,] 0.28 0.27 
[2,] 0.40 0.80 

Вали, я, формат J также используется разреженной матрица матрицы пакет АиРа (все град Мартин Maechler).

+0

Я думаю, что вы делаете полную противоположность тому, что Я хочу сделать. Я хочу перейти от 3D-матрицы к текстовому файлу. У меня есть 3D-массив вероятностей, и мне нужно перейти в текстовый файл (или csv или любой стандартный формат), который является x, y , z координата (матричное положение) и вероятность в этой матричной координате. – Nathan

+0

Я изменю ответ. Это намного проще. –

+0

Настоящая проблема заключается в том, что у меня проблема с импортом файла .mat. Как объяснялось выше, когда я импортирую файл .mat в 3D-массив, но я не могу получить какие-либо его измерения с функциями, о которых я знаю. Без измерений я не могу создать индекс и присвоить значения. На самом деле я буду импортировать от сотен до тысяч этих файлов, и каждый из них будет другого размера. Поэтому мне нужен способ определить размеры неизвестного массива, импортированного из matlab (dim(), length() и nrow() или ncol(), все просто дают значения 1), или чтобы иметь доступ к его индексам и получить значения из каждого местоположения индекса. – Nathan

Смежные вопросы