2014-03-29 12 views
1

행렬 변수가 matrixAmatrixB 인 두 개의 행렬 변수 (float *)가 있습니다. matrixA 및 각 열 matrixB의 각 행에 대해 내적을 계산해야합니다. 나는 이것을 가능한 한 빨리 만들기 위해 Accelerate.frameworkiOS으로 가고있다. iOS - Accelerate.framework를 사용하여 행렬의 각 행 및/또는 열의 내적을 계산합니다.

가 나는 matrixA의 행마다 전체 순환 할 수 있으며 입력 벡터 (여기에서는 내적와 같은 것들)의 제곱의 합을 계산 Accelerate.framework 방법 vDSP_svesq()를 사용할 것을 알았다. 필자의 경우 입력 벡터는 반복 할 행렬의 각 행입니다.

matrixB에 대해 나는 vDSP_svesq() 함수를 사용하고 행렬의 열 수와 동일한 값을 포함하여 각 열의 내적을 계산할 수 있다고 생각합니다.

내 질문은 : 각 행을 철저히 반복하지 않고 각 행마다 점을 계산하는 방법이 있습니까? 루프에서 그렇게하지 않고도 각 행렬 및/또는 열의 내적을 계산하는 방법은 Accelerate.framework입니까?

Accelerate.framework에 대한 설명서는 실제로 이해하기 어렵습니다. 나는 노력하고 있지만 ...

모든 포인터는 크게 감사하겠습니다.

답변

1

당신이 묻는 것이 완전히 명확하지 않습니다. 내적은 두 개의 벡터를 인수로 취하지 만 "각 [벡터]의 내적"에 대해 계속 이야기합니다. 당신이 요구하고 내가 생각 무엇

(L2)의 규범 자체의 각 행 [또는 열]의 내적을 계산하는 방법 각 행 [또는 제품]의 제곱입니다. 그건 당신이 다음 각 행에 vDSP_svesq를 호출 계산하기 위해 완벽하게 합리적 해결책을한다 하려는지 정말 경우

result_i = sum_{j=0}^{j<n} A_ij * A_ij 

: 결과는 누구의 i 번째 항목을 통해 지정하는 벡터가 될 것입니다.

그러나 열의 표준 제곱을 계산할 때는 다른 해결책을 제안합니다. 당신이 말한대로 vDSP_svesq을 사용하여 그것을 시도하면, 당신은 당신의 성능을 거의 망칠 것인데 비 유니트 스트라이드가 필요할 것입니다. 대신 다음을 수행 할 수 있습니다.

void normsSquaredOfColumns(float *result, const float * restrict matrix, 
          int rows, int cols) { 
    // initialize result with squares of the first row. 
    vDSP_vsq(matrix, 1, result, 1, cols); 
    // loop over rows, adding square of each to the result. 
    for (int row=1; row<rows; ++row) 
     vDSP_vma(&matrix[i*cols], 1, &matrix[i*cols], 1, result, 1, result, 1, cols); 
} 
+0

감사합니다. 이제 훨씬 더 의미가 있습니다. 감사! – Brett