Я пытаюсь применить функцию к очень большой матрице. Я хочу со временем создать (40,000 by 40,000
) матрицу (где завершена только одна сторона диагонали) или создать список результатов.
Матрица выглядит так:
obs 1 obs 2 obs 3 obs 4 obs 5 obs 6 obs 7 obs 8 obs 9
words 1 0.2875775 0.5999890 0.2875775 0.5999890 0.2875775 0.5999890 0.2875775 0.5999890 0.2875775
words 2 0.7883051 0.3328235 0.7883051 0.3328235 0.7883051 0.3328235 0.7883051 0.3328235 0.7883051
words 3 0.4089769 0.4886130 0.4089769 0.4886130 0.4089769 0.4886130 0.4089769 0.4886130 0.4089769
words 4 0.8830174 0.9544738 0.8830174 0.9544738 0.8830174 0.9544738 0.8830174 0.9544738 0.8830174
words 5 0.9404673 0.4829024 0.9404673 0.4829024 0.9404673 0.4829024 0.9404673 0.4829024 0.9404673
words 6 0.0455565 0.8903502 0.0455565 0.8903502 0.0455565 0.8903502 0.0455565 0.8903502 0.0455565
Я использую функцию, используя cosine(mat[, 3], mat[, 4])
, которая дает мне одно число.
[,1]
[1,] 0.7546113
Я могу сделать это для всех столбцов, но я хочу знать, из каких столбцов они взяты, то есть приведенные выше вычисления получены из столбцов 3
и 4
, то есть "obs 3"
и "obs 4"
.
Ожидаемый результат может быть результатом в виде списка или матрицы, например:
[,1] [,1] [,1]
[1,] 1 . .
[1,] 0.75 1 .
[1,] 0.23 0.87 1
(где цифры здесь составлены)
Так что размеры будут размером ncol(mat)
на ncol(mat)
(если я пойду матричным методом).
Данные / Код:
#generate some data
mat <- matrix(data = runif(200), nrow = 100, ncol = 20, dimnames = list(paste("words", 1:100),
paste("obs", 1:20)))
mat
#calculate the following function
library(lsa)
cosine(mat[, 3], mat[, 4])
cosine(mat[, 4], mat[, 5])
cosine(mat[, 5], mat[, 6])
Дополнительно
Я думал о том, чтобы сделать следующее:
- Создание пустой матрицы и вычисление функции в цикле forloop, но она не работает должным образом, а создание 40,000 by 40,000
матрицы нулей вызывает проблемы с памятью.
co <- matrix(0L, nrow = ncol(mat), ncol = ncol(mat), dimnames = list(colnames(mat), colnames(mat)))
co
for (i in 2:ncol(mat)) {
for (j in 1:(i - 1)) {
co[i, j] = cosine(mat[, i], mat[, j])
}
}
co
Я также попытался поместить результаты в список:
List <- list()
for(i in 1:ncol(mat))
{
temp <- List[[i]] <- mat
}
res <- List[1][[1]]
res
Что тоже не так.
Поэтому я пытаюсь создать функцию, которая будет столбец за столбцом вычислять функцию и сохранять результаты.