의문:
행렬이 조밀하고 0과 1로만 채워질 때 행렬-벡터 곱셈을 효율적으로 적용하는 코드를 생성하는 절차 나 이론이 있습니까? 이상적으로, 최적화 된 코드는 이전에 계산 된 정보를 체계적으로 사용하여 중복 작업을 줄입니다.
즉, 나는 행렬이 나는에 따라 약간의 사전 계산하고 싶지 컴퓨팅 것, 나중에 벡터받을 때 가능한 한 효율적으로 .
은 "컴파일 타임"으로 알려진 직사각형의 고밀도 이진 행렬 인 반면, 는 "런타임"에서만 알려진 알 수없는 실수 벡터입니다.
예 1 : (슬라이딩 창)
간단한 작은 예를 사용하여 요점을 설명하겠습니다. 매트릭스가 고려 이 행렬을 벡터 에 적용하여 합니다. 그런 다음 결과 항목은
표준 행렬-벡터 곱셈을 수행하면 정확하게 이런 식으로 계산됩니다. 그러나이 작업은 대부분 중복됩니다. 우리는 "실행 총계"를 추적하고 다음 숫자를 얻기 위해 더하기 / 빼기를 통해 동일한 매트릭스 계산을 적은 비용으로 수행 할 수 있습니다 :
예 2 : (계층 구조)
이전 예제에서는 누적 합계를 추적 할 수 있습니다. 그러나 보통 중간 결과 트리를 작성하고 저장해야합니다. 예를 들어 중간 결과 트리를 사용하여 효율적으로 계산할 수 있습니다.w=M의V
- 와 계산 하고 추가하여 을 얻 .승 7 승 3
- 와 계산 하고 추가하여 를 얻 .승 6 승 2
- 추가 및 얻을 수승 3 승 1
위 예제의 구조는보기 쉽지만 관심있는 실제 행렬의 경우 구조가 그렇게 간단하지 않습니다.
예 3 : (낮은 순위)
약간의 혼동을 없애기 위해, 행렬은 일반적으로 희소하지 않습니다. 특히,이 문제를 해결하는 방법은 큰 블록으로 채워진 매트릭스를 적용하는 효율적인 방법을 찾을 수 있어야합니다. 예를 들어
이 행렬은 두 순위 1 행렬의 차이로 분해 될 수 있습니다.
그래서 벡터에 미치는 작용 , 효율적으로 계산할 수
자극:
일부 이미지 처리를 위해 수치 방법을 연구 중이며 모든 구조가 다른 고밀도 행렬이 항상 고정되어 있습니다. 나중에이 행렬은 사용자의 입력에 의존하는 많은 알려지지 않은 벡터 적용되어야 합니다. 지금은 연필과 종이를 사용하여 행렬별로 효율적인 코드를 작성하고 있지만 프로세스를 자동화 할 수 있는지 궁금합니다.
편집 : (postscript)
지금까지 (9/5/15 현재) 여기의 모든 답변은 흥미 롭지 만, 내가 바라는 것처럼 만족스럽게 질문에 대답하지는 않습니다. 아마도 이것은 어려운 연구 문제이며, 아무도 정답을 알지 못합니다.
시간이 촉박 한 이래로 저는 올바른 질문 을 다루기 때문에 EvilJS의 답변에 현상금을 수여하고 있습니다. 그러나 대답에 더 명확하고 자세한 설명이 포함되기를 바랍니다.
tranisstor의 답변 은이 질문과 OMv (Online Boolean Matrix-Vector Multiplication) 문제 사이를 연결하지만이 질문이 정확히 연결하는 것은 아닙니다. 특히 다음 가정은 실제로 적합하지 않습니다 (굵게 강조 표시).
이제 가정 그 모든 모든 행렬 n × n M A n , M v M v O ( n 2 − ε ) ε > 0 우리는 알고리즘을 알고 , 모든 벡터의 계산 시간에 진정 subquadratic 시간, 즉 일부의 .
모든 행렬에 대해 이차 알고리즘이 존재하는지의 여부는 가능한 한 빠른 특정 행렬에 대한 알고리즘을 찾는 문제와 직교합니다. 대부분의 0-1 행렬은 랜덤 노이즈처럼 보이며 (추상한다면) 이차 알고리즘이 없을 것입니다. 그러나 실제로 나쁜 행렬이 있다는 사실은 좋은 행렬, 예를 들어 "슬라이딩 창"행렬에서 빠른 알고리즘을 찾지 못하게합니다.
vzn의 답변, 첫 번째 답변 , 두 번째 답변 은 흥미 롭습니다 (그리고 내 의견으로는 너무 많은 공여를받을 자격이 없습니다).