2014-07-05 7 views
2

부스트 우 블라 행렬의 모든 원소의 제곱근을 계산하려고합니다. 지금까지, 나는 이것을 가지고있다.부스트 우 블라 행렬의 모든 원소의 제곱근

#include <iostream> 
#include "boost\numeric\ublas\matrix.hpp" 
#include <Windows.h> 
#include <math.h> 
#include <cmath> 
#include <algorithm> 
typedef boost::numeric::ublas::matrix<float> matrix; 
const size_t X_SIZE = 10; 
const size_t Y_SIZE = 10; 
void UblasExpr(); 


int main() 
{ 
    UblasExpr(); 
    return 0; 
} 

void UblasExpr() 
{ 
    matrix m1, m2, m3; 
    m1.resize(X_SIZE, Y_SIZE); 
    m2.resize(X_SIZE, Y_SIZE); 
    m3.resize(X_SIZE, Y_SIZE); 

    for (int i = 0; i < X_SIZE; i++) 
    { 
     for (int j = 0; j < Y_SIZE; j++) 
     { 
      m1(i, j) = 2; 
      m2(i, j) = 10; 
     } 
    } 

    m3 = element_prod(m1, m2); 
    std::transform(m1.data().begin(), m1.data().end(), m3.data().begin(), std::sqrtf); 
    for (int i = 0; i < X_SIZE; i++) 
    { 
     for (int j = 0; j < Y_SIZE; j++) 
     { 
      std::cout << m3(i, j) << " "; 
     } 
     std::cout << std::endl; 
    } 
} 

하지만,이 표준을 사용하지 싶습니다 :: 변환, 대신 같은 것을 수행 m3 = sqrtf (M1)를;

작동시키기위한 방법이 있습니까? 내 응용 프로그램은 매우 성능에 민감하므로 효율성을 잃지 않는 경우에만 대안을 사용할 수 있습니다.

P. log10f, cos, acos, sin, asin, pow와 같은 많은 다른 작업을 수행하고 싶습니다. 나는이 모든 것을 내 코드에서 필요로한다.

+0

왜'std :: transform'을 좋아하니? – TemplateRex

답변

3

당신은 적절한 서명으로 자신의 SQRT 함수를 정의 할 수 있습니다

typedef boost::numeric::ublas::matrix<float> matrix; 
matrix sqrt_element(const matrix& a) 
{ 
    matrix result(a.size1(), a.size2()); 
    std::transform(a.data().begin(), a.data().end(), result.data().begin(), std::sqrtf); 
    return result; 
} 

또한 (검증되지 않은 컴파일하지 /) 인수로 호출 목적을 위해 일반적으로 'apply_elementwise'을 정의 할 수 있습니다 :

우리는 returnin하고 이러한 기능에

matrix y(apply_elementwise(std::sqrt, x)); 
matrix z; 
z = apply_elementwise(std::cos, x); 

:로

typedef boost::numeric::ublas::matrix<float> matrix; 

template <typename CALLABLE> 
matrix apply_elementwise(const CALLABLE& f, const matrix& a) 
{ 
    matrix result(a.size1(), a.size2()); 
    std::transform(a.data().begin(), a.data().end(), result.data().begin(), f); 
    return result; 
} 

그럼 당신이 부를 수있는 g 값에 의한 행렬. 이상적으로는, 사용하고있는 행렬 클래스가 rvalue-reference 생성자와 대입 연산자를 사용하여 데이터 복사를 최소화했는지 확인하고 싶습니다.

+0

훌륭한 답변으로, 매우 유용한 방법으로 질문을 받았습니다. – flies