2016-12-07 4 views
1

으로 가져 오기 일부 분석을 위해 Matlab 파일을 R로 가져 오려고합니다. MATLAB 파일은 확률 값의 3D 위치 배열입니다. 즉, z (x, y) 행렬은 z의 "조각"을 가로 지릅니다. 내가하고 싶은 것은 이것을 "위치"와보고 된 확률 값을 가진 R 파일로 변환하는 것입니다. 그래서 출력으로 아래의 라인을 따라 뭔가 : 나는 R.matlab 패키지를 사용하면Matlab에서 3D 배열을 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 

내가 데이터를 가져올 수 있고, 잘 가져가 나타납니다,하지만 난 얻을 수가 없습니다 " 치수 "또는 다른 행렬로 나눕니다 ... 또는 실제로 유용한 것은 없지만 행 * 열 * 조각의 길이 인 값의 긴"목록 "으로 나타나게하십시오. 다음은

몇 가지 예제 코드입니다 :

matlab에 코드

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

R 코드

> 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 <- readMat("file.mat") 
    head(Tdata) 
    str(Tdata) 
    length(Tdata$x) 

는 그래서 TDATA는 하나의 요소임을 보여줍니다 목록을 포함하는 배열이 3 차원이고 각 차원이 정확하고 올바른 총 개수를 가지지 만 이러한 목록 중 하나를 분리하거나 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

그래서 read.octave ("file.mat")로 .mat 파일을 읽으려고했는데이 오류가 발생했습니다 : 스위치 (type, matrix = read_octave_matrix (con), scalar = read_octave_scalar (con) EXPR은 길이 1 벡터 여야합니다 그럼 <- readMat ("file.mat") 데이터로 파일을 읽은 다음 read.octave (data)로 "data"를 읽으려고했습니다. 그런 다음 "data "배열을 읽고, read.octave로 읽는 것. 아무도 내가 잘못하고있는 것일까 요? – Nathan

+0

좋은 점, 그것을 반영하기 위해 텍스트를 업데이트 할 것입니다. 고마워요. – Nathan

답변

2

표시되는 Tdata 개체의 경우 Tdata$x 또는 Tdata[[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 - 출력되게 일례의 부재 희망하지만 안된한다.) 행 독특한 조합을 포함하지만, 함께 dataframes를 생성하는 functiuon 거기

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 

: 당신은 더 적은 직관적 나타날 수있는 lableing으로 호출해야하는데

질문의 오독에 기초한 낡은 대답 :

rd.txt 함수는 읽기만 설정합니다.합니다 (text -argument가 read.table 만들어지기 전에 및 그것을 제조) 표 인자는 dataframe 있도록 헤더 텍스트로부터 읽어 :

> 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 포맷은 또한 R의 희소 행렬 매트릭스 패키지 (마틴 Maechler 모든 우박)에 의해 사용된다.

+0

나는 당신이 3D 행렬에서 텍스트 파일로 이동하려고합니다. 가능성은 3D 배열이며 텍스트 파일 (또는 CSV 또는 표준 형식)으로 이동해야합니다.이 파일은 x, y입니다. , z 좌표 (행렬 위치)와 해당 행렬 좌표의 확률. – Nathan

+0

답을 바꿀 것입니다. 훨씬 더 간단합니다. –

+0

실제 문제는 .mat 파일을 가져 오는 데 문제가 있다는 것입니다. 위에서 설명한대로 .mat 파일을 3D 배열로 가져올 때 내가 아는 기능으로 차원을 얻을 수 없습니다. 차원이 없으면 색인을 생성하고 값을 할당 할 수 없습니다. 실제로 나는 수천 개의 파일을 가져올 것이며 각 파일은 다른 크기가 될 것입니다. 그래서 matlab (dim(), length(), nrow() 또는 ncol()에서 모두 가져온 알 수없는 배열의 치수를 식별하거나 인덱스에 액세스 할 수있는 방법이 필요합니다. 모든 색인 위치의 값. – Nathan

관련 문제