Выделить большую матрицу
Я использую пакет 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
}