Как я могу воспользоваться преимуществами ленточной, несимметричной разреженной матрицы в R с точки зрения скорости хранения и вычислений?

#r #matrix #sparse-matrix #matrix-multiplication

#r #матрица #разреженная матрица #умножение матрицы

Вопрос:

Допустим, у меня есть ленточная несимметричная разреженная матрица, подобная приведенной ниже, созданная с использованием пакета R Matrix:

 x = Matrix(matrix(c(1,0,0,0,0,1,1,0,0,1,0,0,0,0,1,1), 4, 4), sparse = TRUE)
print(x)
1 . . .
. 1 1 .
. 1 . 1
. . . 1
 
  1. Существуют ли какие-либо ранее существовавшие пакеты, которые я могу использовать для более эффективного хранения такой матрицы из-за ее полосчатого характера? Я буду работать с матрицами с тысячами строк / столбцов, поэтому классы разреженных матриц из Matrix экономят там много места для хранения, но я надеюсь сделать еще один шаг из-за его полосатой структуры. Я подумываю о том, чтобы сохранить диагонали и недиагонали матрицы в качестве быстрого решения, но, возможно, есть более разумное решение, доступное в R.
  2. Существует ли в настоящее время реализация умножения матриц в R (или Rcpp или Fortran), которая может выполнять более быстрые матричные умножения с этими ленточными матрицами по сравнению с тем, что доступно для обычных разреженных матриц?

Комментарии:

1. всегда ли они будут трехдиагональными и двоичными? Насколько разрежены сами диагонали (т. Е. Следует ли хранить разреженные векторы или битовые шаблоны?)

2. Хороший вопрос, ни один из них не должен быть истинным. Я беру набор функций для использования в качестве обучения для SVM и переставляю строки и столбцы с помощью обратного переупорядочения mckee, чтобы уменьшить их пропускную способность. Таким образом, на практике они обычно не будут трехдиагональными и двоичными. С точки зрения разреженности, в идеале должно быть размещено все, что содержит> 50% нулевых записей

3. Насколько они будут «полосатыми», т. Е. Сколько / какая доля недиагоналей будет иметь ненулевые элементы? Я подозреваю, что ответ на ваш вопрос будет «нет»; существует несколько разных пакетов с разреженной матрицей ( Matrix , очевидно, , spam , SparseM , grep("sparse",rownames(available.packages()), value=TRUE,ignore.case=TRUE) но я не вижу ничего, кроме индексации, ориентированной на столбцы / строки. BLAS / LAPACK имеют некоторую поддержку для трехдиагональных матриц, но я не вижу ничего более общего, чем это…

4. Это зависит от матрицы, но я видел матрицы с более чем 90% ненулевых отклонений от диагоналей. В любом случае, это улучшение по сравнению с несимметричной матрицей Спасибо за вашу помощь!

5. Насколько я могу судить, bandSparse возвращает только матрицу Csparse, которая является общей, а не только для ленточных матриц. Если я чего-то не упускаю?