2

bigmemoryパッケージを使用しています。wを計算したい。私の v の長さは 478000 で、k の長さは 240500 です。2 つの行列の乗算は w が非常に大きいです。

コードをループで実行しますが、まだ実行中であり、まだ終了しておらず、結果が得られるかどうかわかりません。

forループなしで計算しようとしたのですが、エラーになってしまいました。コードを修正して高速化するための助けをお願いします。

v <-read.big.matrix('v.dat',type='double')
k <-read.big.matrix('k.dat',type='double')
m=length(v);
n=length(k);
for(i in 1:m)
{
    for(j in 1:n)
    {
       w[i,j] = 2 * cos(dt * v[i] * k[j]) - 2
    }
}

w のサイズが非常に大きいため、ループの前に w を定義する方法 のようにはできませんでしw <- matrix(nr,ncol)た。

4

4 に答える 4

2

行列の事前割り当ては、次のように実行できます。

m = matrix(rep(0, number_or_rows*number_of_columns), 
     number_of_rows, number_of_columns))

number_of_rowsこれにより、変数およびで定義された行数と列数を含む行列が作成され、number_of_columns最初はすべて 0 で埋められます。

おそらく問題になるのは、 と のサイズが等しいため、wを埋めるときにメモリの問題が発生する可能性が非常に高いということです。の行列を使用するか、分析をチャンクで実行することで、これを解決できます。vkwbigmemoryw

于 2013-01-18T13:53:59.080 に答える
1

agstudy は正しい方向に進んでいますが、outerここで次のように使用できます。

w <- outer(v,k,FUN=function(x,y) 2*cos(x*y)-2 )

v<-runif(10)
k<-runif(10)
m=length(v);
n=length(k);
w<-matrix(nr=m,nc=n)
for(i in 1:m)
{
    for(j in 1:n)
    {
       w[i,j] = 2 * cos( v[i] * k[j]) - 2
    }
}

ww <- outer(v,k,function(x,y) 2*cos(x*y)-2)

テスト: ww-w はゼロの行列です。

于 2013-01-18T15:33:20.380 に答える
1

「big.matrix」クラスのコンストラクターを使用する必要があります。明らかに RAM リソースを超えているため、「filebacked.big.matrix」として定義する必要があるようです。

w <- filebacked.big.matrix( m, n , # additional arguments to allocate files and dims
                           )

次の最後の例を参照してください。

 help(big.matrix, package=bigmemory)
于 2013-01-18T18:02:51.407 に答える
0

R のベクトル化機能を使用して、次のようなことを行います。

for(i in 1:m)
{
  w[i] = 2 * cos(dt * v[i] * k) - 2 # I compute n terms here
}
于 2013-01-18T14:55:46.733 に答える