Pregunta:
¿Existe algún procedimiento o teoría establecida para generar código que aplique eficientemente una multiplicación matriz-vector, cuando la matriz es densa y está llena de ceros y unos? Idealmente, el código optimizado haría un uso sistemático de la información previamente calculada para reducir el trabajo duplicado.
En otras palabras, tengo una matriz y quiero hacer una precomputación basada en , que hará que calcular más eficiente posible cuando más tarde reciba el vector v .
es una matriz binaria densa rectangular que se conoce en "tiempo de compilación", mientras que es un vector real desconocido que solo se conoce en "tiempo de ejecución".
Ejemplo 1: (ventana deslizante)
Permítanme usar un pequeño ejemplo fácil para ilustrar mi punto. Considere la matriz,
Hacer una multiplicación estándar de matriz-vector se calculará exactamente de esta manera. Sin embargo, mucho de este trabajo es redundante. Podríamos hacer el mismo cálculo matricial a menor costo haciendo un seguimiento de un "total acumulado " y sumando / restando para obtener el siguiente número:
Ejemplo 2: (estructura jerárquica)
En el ejemplo anterior, podríamos hacer un seguimiento de un total acumulado. Sin embargo, generalmente uno necesitaría crear y almacenar un árbol de resultados intermedios. Por ejemplo, considere
- Calcule y , y agréguelos para obtener .
- Calcule y , y agréguelos para obtener .
- Agregue y para obtenerw 3 w 1
La estructura en los ejemplos anteriores es fácil de ver, pero para las matrices reales que me interesan, la estructura no es tan simple.
Ejemplo 3: (rango bajo)
Para aclarar alguna confusión, las matrices generalmente no son escasas. Específicamente, un método para resolver este problema debe ser capaz de encontrar métodos eficientes para aplicar matrices donde los bloques grandes estén llenos de unos. Por ejemplo, considere
Esta matriz se puede descomponer como una diferencia de dos matrices de rango 1,
por lo tanto, su acción en un vector se puede calcular de manera eficiente,
Motivación:
Estoy trabajando en un método numérico para el procesamiento de algunas imágenes, y hay varias matrices grandes y densas con diferentes estructuras que se arreglan para siempre. Más tarde, estas matrices deberán aplicarse a muchos vectores desconocidos que dependerán de la entrada del usuario. En este momento estoy usando lápiz y papel para crear un código eficiente por matriz, pero me pregunto si el proceso puede automatizarse.v i
Editar: (postdata)
Todas las respuestas aquí hasta ahora (hasta el 5/9/15) son interesantes, pero ninguna responde a la pregunta tan satisfactoriamente como esperaba. Probablemente resulta que esta es una pregunta de investigación difícil, y nadie sabe una buena respuesta.
Desde que se acabó el tiempo, estoy otorgando la recompensa a la respuesta de EvilJS, ya que aborda la pregunta correcta. Sin embargo, deseo que la respuesta contenga explicaciones más claras y detalladas.
La respuesta de tranisstor establece una conexión entre esta pregunta y el problema de la Boolean Matrix-Vector Multiplication (OMv) en línea, pero la conexión no es exactamente lo que esta pregunta hace. En particular, la siguiente suposición realmente no encaja (el énfasis es mío),
Ahora suponga que para todas las y todas las matrices n × conocemos un algoritmo , que para todos los vectores calcula en un tiempo verdaderamente subcuadrático, es decir, en el tiempo para algunos . v M v O ( n 2 - ε ) ε > 0
Que existan o no algoritmos subcuadráticos para todas las matrices es ortogonal a la cuestión de encontrar un algoritmo para una matriz específica que sea lo más rápido posible. La mayoría de las matrices 0-1 parecen ruido aleatorio y (si tuviera que adivinar) probablemente no tienen algoritmos subcuadráticos. Sin embargo, el hecho de que haya matrices realmente malas no me impide encontrar un algoritmo rápido en una buena matriz, por ejemplo, una matriz de "ventana deslizante".
Las respuestas de vzn, primera respuesta , segunda respuesta son interesantes (y en mi opinión no merecen tantos votos negativos), pero no se aplican a la pregunta por las razones discutidas en los comentarios allí.