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.
fonte
Respostas:
Se for possível, tente explorar a natureza tridiagonal em faixas da matriz.
Caso contrário, se a matriz contiver apenas um número constante de valores distintos (o que certamente está sendo binário), tente o algoritmo Mailman (de Edo Liberty, Steven W. Zucker No relatório técnico da universidade de Yale # 1402): otimizado em dicionário finito
A eliminação de subexpressão comum é conhecida há algum tempo, como a Multiplicação de Múltiplas Constantes, mas descer para o nível de porta é uma opção - os padrões usados aqui podem ser usados separadamente como solução ou mesclados com outros métodos, o documento para esta seção Algoritmo com um novo método de computação de atraso no nível de porta "por Ning Wu, Xiaoqiang Zhang, Yunfei Ye e Lidong Lan publicado em" Anais do Congresso Mundial de Engenharia e Ciência da Computação 2013 Vol II WCECS 2013, 23-25 de outubro de 2013, São Francisco, EUA " CSE no nível do portão
Também existe um método bruto, mas funcional, para gerar matriz simbólica com constantes, vetor com variáveis e conectá-la à Static Single Assingment (SSA) dos compiladores, que automatiza o processo de escrever matrizes manualmente.
novo protótipo de algoritmo
O que você fez com a soma de execução: Dá 10operaçõese, com a minha ideia inicial de usar Thomas, é equivalente. Por enquanto ainda estou escrevendo e testando novo algoritmo, também os tempos de execução sãodesagradáveis, mas o primeiro resultado do teste me deu uma resposta surpreendente:
fonte
Seria um avanço na área de limites inferiores condicionais, se alguém pudesse provar ou refutar a conjectura acima.
[1] Unificando e fortalecendo a dureza para problemas dinâmicos por meio de uma conjectura de multiplicação de vetores matriciais on-line. por Henzinger, Krinninger, Nanongkai e Saranurak
[ http://eprints.cs.univie.ac.at/4351/1/OMv_conjecture.pdf ]
[2] Multiplicação de vetores matriciais em tempo sub-quadrático: (é necessário algum pré-processamento). por Williams
[ http://dl.acm.org/citation.cfm?id=1283383.1283490 ]
Atualizar
A ideia da prova é simples: suponha que poderíamos fornecer algoritmos rápidos para todas as matrizes até certo tamanho (por exemplo, distinguindo todos os casos possíveis). Após esse tamanho, usamos dividir e conquistar.
Conclusão: Se você pudesse fazer uso de distinções de caso nas matrizes de entrada para derivar algoritmos rápidos, poderia melhorar a conjectura de OMv.
fonte
trata-se essencialmente de CS no nível de pesquisa, o problema é estudado em pelo menos duas formas, uma de multiplicação de matrizes esparsas (exemplo de trabalho que acabamos de citar) e também o caso especial de "matrizes esparsas binárias". o 2 nd caso é conhecida por estar relacionada com optimizar programas em linha recta. programas mínimos também podem ser como DAGs com dois tipos de "portas", adição e multiplicação; portanto, alguma literatura de minimização de circuitos pode se conectar com isso e, possivelmente, o software "pronto para uso" pode ser adaptado para essa finalidade. aqui está uma referência específica no 2º caso e também a mesma pergunta sobre a história com algum estudo empírico inicial básico.
Representando matrizes binárias esparsas como programas lineares para multiplicação rápida de vetores matriciais / Neves, Araujo
Produto cadeia matriz booleano rápido esparso / cstheory
fonte
não tenho certeza se esse problema foi estudado exatamente, mas esta pesquisa está relacionada e parece um avanço / começo razoável. olha a decomposição do hipergrafo para multiplicação esparsa da matriz. matrizes binárias são um caso especial dessa abordagem. essa abordagem encontrará estratégias mais ideais do que o método de multiplicação "direta". otimizações adicionais (dentro dessa estrutura) podem ser possíveis com base na propriedade da matriz binária.
fonte