【发布时间】:2017-04-21 21:17:26
【问题描述】:
我正在尝试将 Matlab 文件导入 R 进行一些分析。 matlab 文件是概率值的 3D 位置数组。因此,它是跨 z 个“切片”的 2D (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)
任何帮助将不胜感激!
【问题讨论】:
-
如果使用 Octave 作为中介,
foreign::read.octave可以直接读入数组。 -
所以我尝试使用 read.octave("file.mat") 读取 .mat 文件,我收到此错误:开关错误(类型,矩阵 = read_octave_matrix(con),标量 = read_octave_scalar (con), : EXPR must be a length 1 vector 然后我尝试使用 data
-
好点,我将更新文本以反映这一点。谢谢。
标签: r matlab multidimensional-array file-conversion