Fortran: multiplicación con matrices que solo contienen +1 y -1 como entradas

¿Cuál sería una forma eficiente (en términos de tiempo de CPU y / o requisitos de memoria) de multiplicar, en fortran9x, una matriz M x N arbitraria, digamos A, que solo contiene +1 y -1 como sus entradas (y completamente poblada! ), con un vector N-dimensional arbitrario (denso), v?

Muchas gracias Osmo

PS El tamaño de A (es decir, M y N) no se conoce en el momento de la compilación.

preguntado el 27 de agosto de 11 a las 16:08

2 Respuestas

Supongo que sería más rápido simplemente hacer la multiplicación en lugar de tratar de evitar la multiplicación verificando el signo del elemento de la matriz y sumando / restando en consecuencia. Por lo tanto, solo use una rutina general de multiplicación de matriz-vector optimizada. Por ejemplo, xGEMV de BLAS.

Respondido 29 ago 11, 00:08

Janneb, gracias. Después de haber intentado encontrar una solución 'inteligente' yo mismo, había llegado a la misma conclusión. Ahora me pregunto si importaría si la matriz A se conociera de antemano. Para proporcionar un contexto, suponga que A - en la aplicación prevista generalmente grande pero 'delgada', digamos (10 ^ 4 hasta 10 ^ 6) x (2 hasta 12) - se generó (en notación Matlab) como A = signo ( randn (1e5,6)) (A necesita poseer un carácter 'aleatorio') y se usa, pero no (re) genera, repetidamente en un algoritmo iterativo. - Osmo Bajric

¿No sería eso una rutina xGEMV en su lugar? - Steabert

Steabert, gracias por el comentario. Tiene razón, la rutina de blas2 xGEMV generalmente sería preferible para realizar un producto de matriz-vector 'optimizado'. Lo que me gustaría ir después, sin embargo, es si alguna ventaja sería posible de la estructura especial de la matriz (solo +1 y -1 como entradas), posiblemente asumiendo el conocimiento 'completo' de A 'por adelantado' ( tal vez sea una idea 'tonta', pero me pregunto si en ese caso 'precompilar' (una parte de) el cálculo matvec sería posible, y si es positivo, conduciría a algo eficiente, al menos en términos de tiempo computacional). Gracias de nuevo. - Osmo Bajric

@Osmo Bajric - ¿Tiene la matriz alguna otra característica especial (simétrica tal vez o algo así)? La matriz llena de ceros se puede tomar como un caso especial, pero +1 y -1 son solo números; No estoy familiarizado con ninguna función que los trate como un caso especial. Para una computadora, +1 y +3 son lo mismo. - Torre

Rook, gracias por unirte. No, la matriz en general no tiene una estructura / característica especial además de estar poblada, de una manera (cuasi) aleatoria, con +1 y -1 (para la 'robustez' / conveniencia requerida en ciertos solucionadores iterativos lineales poderosos pero aún no ampliamente conocidos como, por ejemplo, ML (k) BiCGStab o IDR (s)). NB Solo para evitar una posible confusión, el delgado A aquí no es A de un A * x = b, sino más bien una matriz de 'sombra' (linealmente independiente) en la formación de (ciertos) vectores residuales en el esquema iterativo (signo (randn (m , n) para m >> n generalmente produce una matriz bastante bien condicionada). Osmo Bajric

Dependiendo del escenario de uso, si tiene que aplicar la misma matriz varias veces, puede separarla en dos partes, una con las entradas positivas y otra con las negativas. Con esto puede evitar la necesidad de multiplicaciones, sin embargo introduciría una indirecta, que podría ser más cara que las multiplicaciones. Por tanto, la solución de Janneb podría ser la más adecuada.

Respondido 29 ago 11, 12:08

Haraldkl, gracias por el comentario. Yo (creo) entiendo lo que estás diciendo. Aún así, 'siento' algo aún más eficiente que las rutinas generales de Blas deberían ser posibles en este caso especial de Av, donde A es MxN con M <x = b. Una idea acaba de entrar en mi mente y trataré de resolverla y publicaré mis hallazgos aquí (y en LinkedIn, aunque con mi nombre real), a menos que la idea no sea tan prometedora. - Osmo Bajric

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.