Hàm mẫu hình sin cho Boost.MultiArray trong C ++
Đây là câu hỏi tiếp theo cho Hàm element_wise_add Đối với Boost.MultiArray trong C ++ . Bên cạnh thao tác thêm cơ bản áp dụng cho mỗi phần tử, tôi đang cố gắng triển khai một hàm mẫu sin có thể áp dụng std::sin()cho mỗi phần tử. Một khái niệm mới with_std_sinđược tạo ra như bên dưới.
template<typename T>
concept with_std_sin = requires(T x)
{
std::sin(x);
};
Nội dung chính của sinhàm mẫu này ở đây. Kỹ thuật đệ quy tương tự cũng được sử dụng để đi qua tất cả các phần tử.
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;
}
Kiểm tra sinchức năng mẫu này :
// 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;
Tất cả các đề xuất đều được chào đón.
Câu hỏi nào là tiếp theo?
Một hàm element_wise_add cho Boost.MultiArray trong C ++
Những thay đổi nào đã được thực hiện trong mã kể từ câu hỏi trước?
Câu hỏi trước là việc triển khai áp dụng thao tác thêm vào từng phần tử trong Boost.MultiArray. Ý tưởng chính trong câu hỏi này là thực hiện một
sinhàm mẫu để tính giá trị sin lượng giác của mỗi phần tử.Tại sao một đánh giá mới lại được yêu cầu?
Theo ý kiến của tôi, tôi không chắc đây là một ý tưởng tốt về việc triển khai và sử dụng
with_std_sinkhái niệm ở đây. Nếu có bất kỳ cải thiện nào có thể, xin vui lòng cho tôi biết.
Trả lời
Nó trông rất đơn giản và sạch sẽ. Tôi sẽ thay đổi tên của with_std_sinmặc dù. Có một số hướng dẫn về đặt tên cho các khái niệm gợi ý rằng nó nên được đặt tên sinable. Điều đó trông hơi kỳ lạ, nhưng mọi thứ tôi có thể nghĩ ra để mô tả "thứ gì đó mà std :: sin hỗ trợ" trông kỳ lạ theo một cách nào đó, vì vậy nó cũng hay như bất kỳ cái tên nào.
Tuy nhiên, hãy cân nhắc rằng bạn có thể muốn áp dụng nhiều hàm khác cho nội dung của a boost::multi_array, không chỉ std::sin. Trong trường hợp đó, a recursive_transform()xử lý multi_arrays là cách để đi, vì vậy bạn có thể "chỉ" viết:
auto test_result = recursive_transform(A, [](auto &x){return std::sin(x);});
Hoặc ít nhất là sử dụng điều đó để xác định sin(), cos()v.v. trong điều kiện recursive_transform()mà không cần phải sao chép mã.