将3D数组从Matlab导入R

时间:2016-12-07 03:17:18

标签: r matlab multidimensional-array file-conversion

我正在尝试将一个Matlab文件导入到R中进行一些分析。 matlab文件是概率值的3D位置数组。所以,它是横跨z"切片的二维(x,y)矩阵。我想做的是将其转换为具有"位置"的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)

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

对于显示的Tdata对象,您可以使用Tdata$xTdata[[1]]访问数组。不幸的是,我不知道矩阵函数rowcol的任何等价物。您可以使用一系列嵌套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的示例的情况下未经测试 - 输出。)

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

有一个功能可以生成包含唯一组合的行的数据帧,但是您需要使用可能看起来不那么直观的标签来调用它:

> 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

基于对问题误读的旧答案:

我的rd.txt函数只是设置了read.table参数来读取带有标题的文本以生成数据帧(我在为text创建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

R,#,j,j格式也被R的稀疏矩阵矩阵包使用(都归功于Martin Maechler)。