Questão:
Existe procedimento ou teoria estabelecida para gerar código que aplique eficientemente uma multiplicação de vetor de matriz, quando a matriz é densa e preenchida apenas com zeros e uns? Idealmente, o código otimizado faria uso sistemático de informações previamente calculadas para reduzir o trabalho duplicado.
Em outras palavras, eu tenho uma matriz e quero fazer alguma pré-computação baseada em M , que tornará a computação M v o mais eficiente possível quando eu receber o vetor v mais tarde .
é uma matriz binária densa retangular que é conhecida em "tempo de compilação", enquanto v é um vetor real desconhecido que é conhecido apenas em "tempo de execução".
Exemplo 1: (janela deslizante)
Deixe-me usar um pequeno exemplo fácil para ilustrar meu argumento. Considere a matriz, Supondo que aplicamos essa matriz a um vetorvpara obterw=Mv. Então as entradas do resultado são, w 1
Fazer uma multiplicação de vetor de matriz padrão calculará exatamente dessa maneira. No entanto, muito deste trabalho é redundante. Poderíamos fazer a mesma computação de matriz a um custo menor, acompanhando um "total de execução" e adicionando / subtraindo para obter o próximo número:
Exemplo 2: (estrutura hierárquica)
No exemplo anterior, poderíamos acompanhar um total em execução. No entanto, geralmente é necessário criar e armazenar uma árvore de resultados intermediários. Por exemplo, considere Pode-se calcularw=Mveficientemente usando uma árvore de resultados intermediários:
- Calcule e w 7 , e adicioná-los para obter w 3 .
- Calcule e w 6 , e adicioná-los para obter w 2 .
- Adicione e w 3 para obter w 1
A estrutura nos exemplos acima é fácil de ver, mas para as matrizes reais em que estou interessado, a estrutura não é tão simples.
Exemplo 3: (classificação baixa)
Para esclarecer alguma confusão, as matrizes geralmente não são escassas. Especificamente, um método para resolver esse problema precisa ser capaz de encontrar métodos eficientes para aplicar matrizes onde grandes blocos são preenchidos por outros. Por exemplo, considere
Essa matriz pode ser decomposta como uma diferença de duas matrizes de classificação 1,
portanto, sua ação em um vetor pode ser computada eficientemente por, w 1
Motivação:
Eu estou trabalhando em um método numérico para algum processamento de imagem, e existem vários grandes densas matrizes com estruturas diferentes que são fixados para todos os tempos. Mais tarde, essas matrizes terão de ser aplicadas a muitos vetores desconhecidos v i que vai depender a entrada do usuário. No momento, estou usando lápis e papel para criar código eficiente por matriz, mas estou imaginando se o processo pode ser automatizado.
Editar: (pós-escrito)
Todas as respostas aqui até agora (até 15/5/15) são interessantes, mas nenhuma responde à pergunta de maneira tão satisfatória quanto eu esperava. Provavelmente, essa é uma pergunta de pesquisa difícil e ninguém sabe uma boa resposta.
Como o tempo acabou, concedo a recompensa à resposta do EvilJS, pois ela aborda a pergunta certa. No entanto, desejo que a resposta contenha explicações mais claras e detalhadas.
A resposta do tranisstor faz uma conexão entre esta pergunta e o problema OMv (Online Boolean Matrix-Vector Multiplication), mas a conexão não é exatamente o que esta pergunta está perguntando. Em particular, a seguinte suposição realmente não se encaixa (ênfase em negrito):
Agora assuma que, para todas as e todas as n × n matrizes M , conhecemos um algoritmo , que para todos os vetores v calcula M v em tempo verdadeiramente subquadrático, ou seja, no tempo O ( n 2 - ε ) para alguns ε > 0 .
A existência ou não de algoritmos subquadráticos para todas as matrizes é ortogonal à questão de encontrar um algoritmo para uma matriz específica o mais rápido possível. A maioria das matrizes 0-1 se parece com ruído aleatório e (se eu fosse adivinhar) provavelmente não possui algoritmos subquadráticos. No entanto, o fato de haver matrizes realmente ruins por aí não me impede de encontrar um algoritmo rápido em uma boa matriz, por exemplo, uma matriz de "janela deslizante".
As respostas do vzn, primeira resposta e segunda resposta são interessantes (e, na minha opinião, não merecem tantos votos negativos), mas elas não se aplicam à pergunta pelas razões discutidas nos comentários.