Supongamos que conozco la escasez esperada de una matriz (es decir, el número de ceros / número total posible de ceros). ¿Existe una regla general (tal vez aproximada) para decidir si usar el almacenamiento de matriz dispersa (específicamente, almacenamiento de fila comprimido) en lugar de almacenarlo como una matriz densa?
- La velocidad es más importante en mi aplicación que la memoria. Pero por curiosidad general, me interesan las respuestas desde la perspectiva de la velocidad y la memoria.
- Después de generar la matriz, solo aplico operaciones de suma y multiplicación en ella.
- Solo he podido encontrar respuestas cualitativas, por ejemplo, esta pregunta y esta pregunta, pero estoy buscando algo como
... si la escasez es más de aproximadamente , entonces use almacenamiento denso.
Por lo que vale, para matrices dispersas aleatorias de tamaño 10,000 por 10,000 versus matrices densas del mismo tamaño, en mi estación de trabajo Xeon usando MATLAB e Intel MKL como BLAS, la multiplicación de matriz-vector dispersa fue más rápida para densidades de 15% o menos. Al 67% (según lo propuesto por otra respuesta ), la densa multiplicación matriz-vector fue aproximadamente tres veces más rápida.
fuente
Incluso si una matriz es muy escasa, su producto matriz puede ser denso. Tome, por ejemplo, una matriz diagonal y complete su primera fila y columna con entradas distintas de cero; su producto consigo mismo será completamente denso. Tal matriz puede surgir, por ejemplo, como un gráfico laplaciano de un gráfico en el que hay un vértice que está conectado a todos los demás vértices. En la práctica, es suficiente si hay pocos vértices con conectividad bastante alta con el resto de la red. Para la multiplicación de matriz-vector, este fenómeno es menos relevante, aunque puede conducir a desequilibrios al intentar paralelizar la multiplicación de matriz-vector.
Lo que quiero destacar: Realmente depende del patrón de dispersión y de lo que desea hacer con la matriz. Entonces, la mejor definición de una matriz dispersa que se me ocurre (que es bastante inútil al mismo tiempo) es la siguiente:
La lección que debe aprender: Realmente depende de lo que quiera hacer con él , qué algoritmo use y (como otros ya lo han señalado) qué hardware y software usará si una matriz dada es escasa o no (lea como: si debe usar una estructura de datos de matriz escasa o densa). No puede haber una regla puramente basada en porcentajes si no se trata solo de almacenar datos o la multiplicación de vectores de matriz. La mejor manera de averiguar si sus matrices son escasas es probarlo y compararlo con los métodos de matriz densa.
fuente