Выделить большую матрицу

Я использую пакет Bigmemory. Я хочу рассчитать ш. Моя длина v равна 478000, а длина k равна 240500. Умножение двух матриц очень большое.

Я запускаю код за циклом, но он все еще работает и еще не закончен, и я не знаю, даст мне результат или нет.

Я пытался вычислить это без цикла 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 ответа

Предварительное выделение матрицы можно сделать так:

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

Это создает матрицу с количеством строк и столбцов, определенных в переменных number_of_rows а также number_of_columns, заполненный изначально со всеми 0.

Что, вероятно, будет проблемой, так это потому, что w равен по размеру v а также kвы можете очень хорошо столкнуться с проблемами памяти при заполнении w, Вы можете решить эту проблему, также используя bigmemory матрица для wили запустить анализ по частям.

Вам нужно использовать конструкторы класса "big.matrix", и, поскольку вы явно превышаете ресурсы ОЗУ, может показаться необходимым определить его как "filebacked.big.matrix".

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

Смотрите последний пример в:

 help(big.matrix, package=bigmemory)

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 - это матрица нулей.

Я хотел бы сделать что-то вроде этого, используя функцию векторизации R:

for(i in 1:m)
{
  w[i] = 2 * cos(dt * v[i] * k) - 2 # I compute n terms here
}
Другие вопросы по тегам