2016-12-07 8 views
1

いくつかの解析のために、MatlabファイルをRにインポートしようとしています。 MATLABファイルは、確率値の3D位置配列です。したがって、z "スライス"を横切る2D(x、y)行列です。私がしたいのは、これを "場所"と報告された確率値を持つRファイルに変換することです。だから、出力として以下の線に沿って何か:MatlabからRへの3D配列のインポート

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コード

> 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とが単一の要素であることを示す出力

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

リストを含む配列は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) 

助けていただければ幸いです!あなたがTdata$xまたはTdata[[1]]を持つ配列を取得表示されTdataオブジェクトに対して

+0

Octaveを仲介者として使用すると、 'foreign :: read.octave'は配列で直接読み取ることができます。 – alistaire

+0

だから私はread.octave( "file.mat")で.MATファイルを読み込むしようと、私はこのエラーを取得する:スイッチで エラー(タイプ、マトリックス= read_octave_matrix(CON)、スカラー= read_octave_scalar(CON)、: EXPRは長さ1のベクトルでなければなりません 次に、ファイル< - readMat( "file.mat")でファイルを読み込み、read.octave(data)で "data"を読み取ってみました。私が間違っているのは何ですか? – Nathan

+0

良い点、それを反映するようにテキストを更新します。ありがとう。 – Nathan

答えて

2

。残念ながら、私はマトリックス関数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 -outputで提示された例の非存在下でテストされていない。)オブジェクトを返す

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

固有の組み合わせを含む行とデータフレームを生成functiuonがあるもののあなたはあまり直感的に表示される場合があります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 

質問の誤読に基づく古い回答:

私のrd.txt関数はちょうど読み取りを設定します。(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 

ヴァル、I、Jの形式は、Rのスパース行列の行列パッケージ(マーティンMaechlerへのすべての雹)で使用されています。

+0

私はあなたが何のことと正反対のことをしていると思いますか?私は3D行列からテキストファイルに行きたいと思っていますが、確率は3D配列であり、テキストファイル(またはCSVまたは標準形式)に移動する必要があります。これはx、yです。 、z座標(マトリクス位置)とそのマトリクス座標における確率との関係を示す。 – Nathan

+0

私は答えを変更します。はるかに簡単です。 –

+0

実際の問題は、.matファイルをインポートする際に問題が発生していることです。上で説明したように、.matファイルを3D配列にインポートすると、私は知っている関数で次元を得ることができません。ディメンションがないと、インデックスを生成して値を割り当てることができません。実際には、これらのファイルを数百にインポートして、それぞれが異なるサイズになります。だから、matlab(dim()、length()、nrow()またはncol()の値を1だけ与える)からインポートされた未知の配列の次元を特定する方法や、そのインデックスにアクセスしてgetすべてのインデックス位置からの値。 – Nathan

関連する問題