C ++의 Boost.MultiArray에 대한 사인 템플릿 함수

Nov 02 2020

이것은 An element_wise_add Function For Boost.MultiArray in C ++에 대한 후속 질문입니다 . 각 요소에 적용되는 기본 추가 작업 외에도 각 요소에 적용 할 수있는 사인 템플릿 기능을 구현하려고합니다 std::sin(). with_std_sin아래와 같이 새로운 개념 이 만들어집니다.

template<typename T>
concept with_std_sin = requires(T x)
{
    std::sin(x);
};

sin템플릿 기능의 본문 은 여기에 있습니다. 모든 요소를 ​​통과하기 위해 유사한 재귀 기술도 사용됩니다.

template<class T> requires (with_std_sin<T>)
auto sin(const T& input)
{
    return std::sin(input);
}

template<class T> requires (is_multi_array<T>)
auto sin(const T& input)
{
    boost::multi_array output(input);
    for (decltype(+input.shape()[0]) i = 0; i < input.shape()[0]; i++)
    {
        output[i] = sin(input[i]);
    }
    return output;
}

sin템플릿 기능 의 테스트 :

// Create a 3D array that is 3 x 4 x 2
typedef boost::multi_array<double, 3> array_type;
typedef array_type::index index;
array_type A(boost::extents[3][4][2]);

// Assign values to the elements
int values = 1;
for (index i = 0; i != 3; ++i)
    for (index j = 0; j != 4; ++j)
        for (index k = 0; k != 2; ++k)
            A[i][j][k] = values++;

for (index i = 0; i != 3; ++i)
    for (index j = 0; j != 4; ++j)
        for (index k = 0; k != 2; ++k)
            std::cout << A[i][j][k] << std::endl;

auto test_result = sin(A);

for (index i = 0; i != 3; ++i)
    for (index j = 0; j != 4; ++j)
        for (index k = 0; k != 2; ++k)
            std::cout << test_result[i][j][k] << std::endl;

모든 제안을 환영합니다.

  • 어떤 질문에 대한 후속 조치입니까?

    C ++의 Boost.MultiArray에 대한 element_wise_add 함수

  • 지난 질문 이후 코드에서 어떤 변화가 있었습니까?

    이전 질문은 Boost.MultiArray의 각 요소에 추가 작업을 적용하는 구현입니다. 이 질문의 주요 아이디어 sin는 각 요소의 삼각 사인 값을 계산 하기위한 템플릿 함수 를 구현하는 것 입니다.

  • 새로운 리뷰가 요청되는 이유는 무엇입니까?

    제 생각에는 이것이 with_std_sin여기 에서 개념 의 구현 및 사용에 대한 좋은 아이디어인지 확실하지 않습니다 . 개선 사항이 있으면 알려주십시오.

답변

1 G.Sliepen Nov 02 2020 at 21:01

매우 간단하고 깨끗해 보입니다. with_std_sin그래도 이름을 바꿀 것 입니다. 이름을 지정 해야한다고 제안하는 이름 지정 개념에 대한 몇 가지 지침 이 있습니다 sinable. 약간 이상해 보이지만 "std :: sin이 지원하는 것"을 설명 할 수있는 모든 것이 어떤면에서 이상해 보이므로 어떤 이름만큼이나 좋습니다.

그러나 .NET boost::multi_array뿐만 아니라 의 내용에 다른 많은 기능을 적용 할 수도 있습니다 std::sin. 이 경우 s recursive_transform()를 처리 하는 a 가 multi_array갈 길이므로 "그냥"다음과 같이 작성할 수 있습니다.

auto test_result = recursive_transform(A, [](auto &x){return std::sin(x);});

또는 정의하는 것을 이상 사용에서 sin(), cos()의 therms에에 그래서 recursive_transform()코드를 복제 할 필요없이.