4
\$\begingroup\$

This is a follow-up question for An Updated Multi-dimensional Image Data Structure with Variadic Template Functions in C++, histogram Template Function Implementation for Image in C++, Histogram of Image using std::map in C++ and histogram_normalized and histogram_with_bins Template Functions Implementation for Image in C++.

In terms of API, I would write a normalize_histogram() instead, taking a histogram as input.

I implemented normalize_histogram template function which takes a histogram as input.

The experimental implementation

  • normalize_histogram template function implementation

    Normalize a histogram.

    // normalize_histogram template function implementation for std::array template<class ElementT, std::size_t Count, class ProbabilityType = double> constexpr static auto normalize_histogram(const std::array<ElementT, Count> input) { auto sum = std::reduce(std::ranges::cbegin(input), std::ranges::cend(input)); std::array<ProbabilityType, Count> output{}; for (std::size_t i = 0; i < Count; ++i) { output[i] = static_cast<ProbabilityType>(input[i]) / static_cast<ProbabilityType>(sum); } return output; } // normalize_histogram template function implementation for std::array (with Execution Policy) template<class ExecutionPolicy, class ElementT, std::size_t Count, class ProbabilityType = double> requires(std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>) constexpr static auto normalize_histogram(ExecutionPolicy execution_policy, const std::array<ElementT, Count> input) { auto sum = std::reduce(execution_policy, std::ranges::cbegin(input), std::ranges::cend(input)); std::array<ProbabilityType, Count> output{}; for (std::size_t i = 0; i < Count; ++i) { output[i] = static_cast<ProbabilityType>(input[i]) / static_cast<ProbabilityType>(sum); } return output; } // normalize_histogram template function implementation template<class ElementT, class CountT, class ProbabilityType = double> requires(std::floating_point<CountT> || std::integral<CountT>) constexpr static auto normalize_histogram(const std::map<ElementT, CountT> input) { CountT sum{}; for (const auto& [key, value] : input) { sum += value; } std::map<ElementT, ProbabilityType> output{}; for (const auto& [key, value] : input) { output.emplace(key, static_cast<ProbabilityType>(value) / static_cast<ProbabilityType>(sum)); } return output; } 

The usage of normalize_histogram template function:

/* Developed by Jimmy Hu */ #include <chrono> #include "../base_types.h" #include "../basic_functions.h" #include "../image.h" #include "../image_io.h" #include "../image_operations.h" template<class ExPo, class ElementT> requires (std::is_execution_policy_v<std::remove_cvref_t<ExPo>>) constexpr static auto HistogramTest( ExPo execution_policy, const TinyDIP::Image<ElementT>& input, std::ostream& os = std::cout ) { auto hsv_image = TinyDIP::rgb2hsv(execution_policy, input); auto start1 = std::chrono::system_clock::now(); auto histogram_result1 = TinyDIP::histogram(TinyDIP::getVplane(hsv_image)); os << "***** std::map Histogram *****\n"; for (const auto& [key, value] : histogram_result1 ) { os << "key = " << key << ", value = " << value << '\n'; } os << "***** Normalized std::map Histogram *****\n"; auto normalized_histogram1 = TinyDIP::normalize_histogram(histogram_result1); double sum = 0.0; for (const auto& [key, value] : normalized_histogram1) { os << "key = " << key << ", value = " << value << '\n'; sum += value; } os << "sum = " << sum << '\n'; os << "-------------------------------------------------------"; auto histogram_result2 = TinyDIP::histogram(TinyDIP::im2uint8(TinyDIP::getVplane(hsv_image))); os << "***** std::array Histogram *****\n"; for (std::size_t i = 0; i < histogram_result2.size(); ++i) { std::cout << i << " count = " << histogram_result2[i] << '\n'; } auto normalized_histogram2 = TinyDIP::normalize_histogram(execution_policy, histogram_result2); os << "***** Normalized std::array Histogram *****\n"; sum = 0.0; for (std::size_t i = 0; i < normalized_histogram2.size(); ++i) { std::cout << i << " count = " << normalized_histogram2[i] << '\n'; sum += normalized_histogram2[i]; } os << "sum = " << sum << '\n'; auto end1 = std::chrono::system_clock::now(); std::chrono::duration<double> elapsed_seconds1 = end1 - start1; os << "elapsed time: " << elapsed_seconds1.count() << '\n'; return histogram_result1; } int main() { auto start = std::chrono::system_clock::now(); std::string image_filename = "1.bmp"; auto image_input = TinyDIP::bmp_read(image_filename.c_str(), true); image_input = TinyDIP::copyResizeBicubic(image_input, 3 * image_input.getWidth(), 3 * image_input.getHeight()); HistogramTest(std::execution::par, image_input); auto end = std::chrono::system_clock::now(); std::chrono::duration<double> elapsed_seconds = end - start; std::time_t end_time = std::chrono::system_clock::to_time_t(end); std::cout << "Computation finished at " << std::ctime(&end_time) << "elapsed time: " << elapsed_seconds.count() << '\n'; return EXIT_SUCCESS; } 

The output of the test code above:

Width of the input image: 454 Height of the input image: 341 Size of the input image(Byte): 464442 ***** std::map Histogram ***** key = 0, value = 1966 key = 1, value = 65 key = 2, value = 72 key = 3, value = 75 key = 4, value = 71 key = 5, value = 49 key = 6, value = 67 key = 7, value = 52 key = 8, value = 78 key = 9, value = 58 key = 10, value = 60 key = 11, value = 58 key = 12, value = 66 key = 13, value = 75 key = 14, value = 86 key = 15, value = 98 key = 16, value = 105 key = 17, value = 139 key = 18, value = 301 key = 19, value = 554 key = 20, value = 1052 key = 21, value = 1551 key = 22, value = 2407 key = 23, value = 3593 key = 24, value = 5618 key = 25, value = 8144 key = 26, value = 10541 key = 27, value = 12335 key = 28, value = 14096 key = 29, value = 15881 key = 30, value = 16950 key = 31, value = 17881 key = 32, value = 18950 key = 33, value = 19432 key = 34, value = 20085 key = 35, value = 20687 key = 36, value = 21367 key = 37, value = 21758 key = 38, value = 22450 key = 39, value = 23288 key = 40, value = 23501 key = 41, value = 23818 key = 42, value = 24173 key = 43, value = 23949 key = 44, value = 23445 key = 45, value = 22823 key = 46, value = 22218 key = 47, value = 21807 key = 48, value = 21137 key = 49, value = 20491 key = 50, value = 19820 key = 51, value = 19644 key = 52, value = 19148 key = 53, value = 18567 key = 54, value = 18190 key = 55, value = 17536 key = 56, value = 16935 key = 57, value = 16640 key = 58, value = 15821 key = 59, value = 15337 key = 60, value = 14813 key = 61, value = 14085 key = 62, value = 13722 key = 63, value = 13101 key = 64, value = 12752 key = 65, value = 12188 key = 66, value = 11973 key = 67, value = 11385 key = 68, value = 11036 key = 69, value = 10681 key = 70, value = 10205 key = 71, value = 9761 key = 72, value = 9574 key = 73, value = 9162 key = 74, value = 9056 key = 75, value = 8700 key = 76, value = 8270 key = 77, value = 8096 key = 78, value = 7671 key = 79, value = 7575 key = 80, value = 7366 key = 81, value = 7262 key = 82, value = 7011 key = 83, value = 6692 key = 84, value = 6533 key = 85, value = 6459 key = 86, value = 5996 key = 87, value = 5783 key = 88, value = 5764 key = 89, value = 5554 key = 90, value = 5413 key = 91, value = 5310 key = 92, value = 5069 key = 93, value = 5021 key = 94, value = 5026 key = 95, value = 4816 key = 96, value = 4788 key = 97, value = 4561 key = 98, value = 4528 key = 99, value = 4296 key = 100, value = 4308 key = 101, value = 4316 key = 102, value = 4123 key = 103, value = 4023 key = 104, value = 3850 key = 105, value = 3873 key = 106, value = 3731 key = 107, value = 3737 key = 108, value = 3685 key = 109, value = 3566 key = 110, value = 3505 key = 111, value = 3462 key = 112, value = 3383 key = 113, value = 3350 key = 114, value = 3264 key = 115, value = 3204 key = 116, value = 3216 key = 117, value = 3187 key = 118, value = 3191 key = 119, value = 3163 key = 120, value = 2903 key = 121, value = 3040 key = 122, value = 2956 key = 123, value = 2899 key = 124, value = 2802 key = 125, value = 2916 key = 126, value = 2833 key = 127, value = 2745 key = 128, value = 2918 key = 129, value = 2843 key = 130, value = 2795 key = 131, value = 2718 key = 132, value = 2758 key = 133, value = 2781 key = 134, value = 2821 key = 135, value = 2755 key = 136, value = 2763 key = 137, value = 2739 key = 138, value = 2770 key = 139, value = 2705 key = 140, value = 2812 key = 141, value = 2733 key = 142, value = 2766 key = 143, value = 2792 key = 144, value = 2790 key = 145, value = 2813 key = 146, value = 2674 key = 147, value = 2655 key = 148, value = 2544 key = 149, value = 2562 key = 150, value = 2542 key = 151, value = 2668 key = 152, value = 2586 key = 153, value = 2521 key = 154, value = 2525 key = 155, value = 2497 key = 156, value = 2503 key = 157, value = 2513 key = 158, value = 2517 key = 159, value = 2406 key = 160, value = 2526 key = 161, value = 2571 key = 162, value = 2531 key = 163, value = 2504 key = 164, value = 2536 key = 165, value = 2454 key = 166, value = 2529 key = 167, value = 2651 key = 168, value = 2530 key = 169, value = 2519 key = 170, value = 2522 key = 171, value = 2600 key = 172, value = 2614 key = 173, value = 2603 key = 174, value = 2748 key = 175, value = 2711 key = 176, value = 2783 key = 177, value = 2877 key = 178, value = 2921 key = 179, value = 2909 key = 180, value = 2814 key = 181, value = 2747 key = 182, value = 2648 key = 183, value = 2615 key = 184, value = 2510 key = 185, value = 2526 key = 186, value = 2363 key = 187, value = 2284 key = 188, value = 2036 key = 189, value = 2022 key = 190, value = 1908 key = 191, value = 1912 key = 192, value = 1920 key = 193, value = 1818 key = 194, value = 1896 key = 195, value = 1977 key = 196, value = 2016 key = 197, value = 2030 key = 198, value = 2004 key = 199, value = 1855 key = 200, value = 1660 key = 201, value = 1485 key = 202, value = 1395 key = 203, value = 1314 key = 204, value = 1278 key = 205, value = 1064 key = 206, value = 899 key = 207, value = 850 key = 208, value = 847 key = 209, value = 824 key = 210, value = 834 key = 211, value = 838 key = 212, value = 839 key = 213, value = 833 key = 214, value = 913 key = 215, value = 844 key = 216, value = 807 key = 217, value = 827 key = 218, value = 837 key = 219, value = 846 key = 220, value = 889 key = 221, value = 863 key = 222, value = 871 key = 223, value = 931 key = 224, value = 909 key = 225, value = 924 key = 226, value = 950 key = 227, value = 878 key = 228, value = 895 key = 229, value = 833 key = 230, value = 909 key = 231, value = 959 key = 232, value = 870 key = 233, value = 943 key = 234, value = 915 key = 235, value = 870 key = 236, value = 897 key = 237, value = 986 key = 238, value = 925 key = 239, value = 1003 key = 240, value = 999 key = 241, value = 1016 key = 242, value = 1003 key = 243, value = 1032 key = 244, value = 1067 key = 245, value = 1062 key = 246, value = 1148 key = 247, value = 1188 key = 248, value = 1311 key = 249, value = 1391 key = 250, value = 1522 key = 251, value = 1704 key = 252, value = 2114 key = 253, value = 2766 key = 254, value = 4315 key = 255, value = 39663 ***** Normalized std::map Histogram ***** key = 0, value = 0.00141101 key = 1, value = 4.6651e-05 key = 2, value = 5.16749e-05 key = 3, value = 5.3828e-05 key = 4, value = 5.09572e-05 key = 5, value = 3.51676e-05 key = 6, value = 4.80864e-05 key = 7, value = 3.73208e-05 key = 8, value = 5.59812e-05 key = 9, value = 4.1627e-05 key = 10, value = 4.30624e-05 key = 11, value = 4.1627e-05 key = 12, value = 4.73687e-05 key = 13, value = 5.3828e-05 key = 14, value = 6.17228e-05 key = 15, value = 7.03353e-05 key = 16, value = 7.53592e-05 key = 17, value = 9.97613e-05 key = 18, value = 0.00021603 key = 19, value = 0.00039761 key = 20, value = 0.000755028 key = 21, value = 0.00111316 key = 22, value = 0.00172752 key = 23, value = 0.00257872 key = 24, value = 0.00403208 key = 25, value = 0.00584501 key = 26, value = 0.00756535 key = 27, value = 0.00885292 key = 28, value = 0.0101168 key = 29, value = 0.0113979 key = 30, value = 0.0121651 key = 31, value = 0.0128333 key = 32, value = 0.0136006 key = 33, value = 0.0139465 key = 34, value = 0.0144151 key = 35, value = 0.0148472 key = 36, value = 0.0153352 key = 37, value = 0.0156159 key = 38, value = 0.0161125 key = 39, value = 0.016714 key = 40, value = 0.0168668 key = 41, value = 0.0170943 key = 42, value = 0.0173491 key = 43, value = 0.0171884 key = 44, value = 0.0168266 key = 45, value = 0.0163802 key = 46, value = 0.015946 key = 47, value = 0.015651 key = 48, value = 0.0151702 key = 49, value = 0.0147065 key = 50, value = 0.014225 key = 51, value = 0.0140986 key = 52, value = 0.0137427 key = 53, value = 0.0133257 key = 54, value = 0.0130551 key = 55, value = 0.0125857 key = 56, value = 0.0121544 key = 57, value = 0.0119426 key = 58, value = 0.0113548 key = 59, value = 0.0110075 key = 60, value = 0.0106314 key = 61, value = 0.0101089 key = 62, value = 0.00984838 key = 63, value = 0.00940268 key = 64, value = 0.0091522 key = 65, value = 0.00874741 key = 66, value = 0.00859311 key = 67, value = 0.0081711 key = 68, value = 0.00792062 key = 69, value = 0.00766583 key = 70, value = 0.0073242 key = 71, value = 0.00700554 key = 72, value = 0.00687133 key = 73, value = 0.00657563 key = 74, value = 0.00649956 key = 75, value = 0.00624405 key = 76, value = 0.00593544 key = 77, value = 0.00581056 key = 78, value = 0.00550553 key = 79, value = 0.00543663 key = 80, value = 0.00528663 key = 81, value = 0.00521199 key = 82, value = 0.00503184 key = 83, value = 0.0048029 key = 84, value = 0.00468878 key = 85, value = 0.00463567 key = 86, value = 0.00430337 key = 87, value = 0.0041505 key = 88, value = 0.00413686 key = 89, value = 0.00398615 key = 90, value = 0.00388495 key = 91, value = 0.00381102 key = 92, value = 0.00363806 key = 93, value = 0.00360361 key = 94, value = 0.0036072 key = 95, value = 0.00345648 key = 96, value = 0.00343638 key = 97, value = 0.00327346 key = 98, value = 0.00324978 key = 99, value = 0.00308327 key = 100, value = 0.00309188 key = 101, value = 0.00309762 key = 102, value = 0.00295911 key = 103, value = 0.00288734 key = 104, value = 0.00276317 key = 105, value = 0.00277968 key = 106, value = 0.00267777 key = 107, value = 0.00268207 key = 108, value = 0.00264475 key = 109, value = 0.00255934 key = 110, value = 0.00251556 key = 111, value = 0.0024847 key = 112, value = 0.002428 key = 113, value = 0.00240432 key = 114, value = 0.0023426 key = 115, value = 0.00229953 key = 116, value = 0.00230815 key = 117, value = 0.00228733 key = 118, value = 0.0022902 key = 119, value = 0.00227011 key = 120, value = 0.0020835 key = 121, value = 0.00218183 key = 122, value = 0.00212154 key = 123, value = 0.00208063 key = 124, value = 0.00201102 key = 125, value = 0.00209283 key = 126, value = 0.00203326 key = 127, value = 0.00197011 key = 128, value = 0.00209427 key = 129, value = 0.00204044 key = 130, value = 0.00200599 key = 131, value = 0.00195073 key = 132, value = 0.00197944 key = 133, value = 0.00199594 key = 134, value = 0.00202465 key = 135, value = 0.00197728 key = 136, value = 0.00198302 key = 137, value = 0.0019658 key = 138, value = 0.00198805 key = 139, value = 0.0019414 key = 140, value = 0.00201819 key = 141, value = 0.00196149 key = 142, value = 0.00198518 key = 143, value = 0.00200384 key = 144, value = 0.0020024 key = 145, value = 0.00201891 key = 146, value = 0.00191915 key = 147, value = 0.00190551 key = 148, value = 0.00182585 key = 149, value = 0.00183877 key = 150, value = 0.00182441 key = 151, value = 0.00191484 key = 152, value = 0.00185599 key = 153, value = 0.00180934 key = 154, value = 0.00181221 key = 155, value = 0.00179211 key = 156, value = 0.00179642 key = 157, value = 0.0018036 key = 158, value = 0.00180647 key = 159, value = 0.0017268 key = 160, value = 0.00181293 key = 161, value = 0.00184523 key = 162, value = 0.00181652 key = 163, value = 0.00179714 key = 164, value = 0.00182011 key = 165, value = 0.00176125 key = 166, value = 0.00181508 key = 167, value = 0.00190264 key = 168, value = 0.0018158 key = 169, value = 0.0018079 key = 170, value = 0.00181006 key = 171, value = 0.00186604 key = 172, value = 0.00187609 key = 173, value = 0.00186819 key = 174, value = 0.00197226 key = 175, value = 0.0019457 key = 176, value = 0.00199738 key = 177, value = 0.00206484 key = 178, value = 0.00209642 key = 179, value = 0.00208781 key = 180, value = 0.00201963 key = 181, value = 0.00197154 key = 182, value = 0.00190049 key = 183, value = 0.0018768 key = 184, value = 0.00180144 key = 185, value = 0.00181293 key = 186, value = 0.00169594 key = 187, value = 0.00163924 key = 188, value = 0.00146125 key = 189, value = 0.0014512 key = 190, value = 0.00136939 key = 191, value = 0.00137226 key = 192, value = 0.001378 key = 193, value = 0.00130479 key = 194, value = 0.00136077 key = 195, value = 0.00141891 key = 196, value = 0.0014469 key = 197, value = 0.00145695 key = 198, value = 0.00143829 key = 199, value = 0.00133135 key = 200, value = 0.00119139 key = 201, value = 0.0010658 key = 202, value = 0.0010012 key = 203, value = 0.000943067 key = 204, value = 0.00091723 key = 205, value = 0.00076364 key = 206, value = 0.000645219 key = 207, value = 0.000610051 key = 208, value = 0.000607898 key = 209, value = 0.000591391 key = 210, value = 0.000598568 key = 211, value = 0.000601439 key = 212, value = 0.000602156 key = 213, value = 0.00059785 key = 214, value = 0.000655267 key = 215, value = 0.000605745 key = 216, value = 0.00057919 key = 217, value = 0.000593544 key = 218, value = 0.000600721 key = 219, value = 0.00060718 key = 220, value = 0.000638042 key = 221, value = 0.000619381 key = 222, value = 0.000625123 key = 223, value = 0.000668185 key = 224, value = 0.000652396 key = 225, value = 0.000663161 key = 226, value = 0.000681822 key = 227, value = 0.000630147 key = 228, value = 0.000642348 key = 229, value = 0.00059785 key = 230, value = 0.000652396 key = 231, value = 0.000688281 key = 232, value = 0.000624405 key = 233, value = 0.000676798 key = 234, value = 0.000656702 key = 235, value = 0.000624405 key = 236, value = 0.000643783 key = 237, value = 0.000707659 key = 238, value = 0.000663879 key = 239, value = 0.00071986 key = 240, value = 0.000716989 key = 241, value = 0.00072919 key = 242, value = 0.00071986 key = 243, value = 0.000740674 key = 244, value = 0.000765794 key = 245, value = 0.000762205 key = 246, value = 0.000823928 key = 247, value = 0.000852636 key = 248, value = 0.000940914 key = 249, value = 0.000998331 key = 250, value = 0.00109235 key = 251, value = 0.00122297 key = 252, value = 0.00151723 key = 253, value = 0.00198518 key = 254, value = 0.00309691 key = 255, value = 0.0284664 sum = 1 -------------------------------------------------------***** std::array Histogram ***** 0 count = 1966 1 count = 65 2 count = 72 3 count = 75 4 count = 71 5 count = 49 6 count = 67 7 count = 52 8 count = 78 9 count = 58 10 count = 60 11 count = 58 12 count = 66 13 count = 75 14 count = 86 15 count = 98 16 count = 105 17 count = 139 18 count = 301 19 count = 554 20 count = 1052 21 count = 1551 22 count = 2407 23 count = 3593 24 count = 5618 25 count = 8144 26 count = 10541 27 count = 12335 28 count = 14096 29 count = 15881 30 count = 16950 31 count = 17881 32 count = 18950 33 count = 19432 34 count = 20085 35 count = 20687 36 count = 21367 37 count = 21758 38 count = 22450 39 count = 23288 40 count = 23501 41 count = 23818 42 count = 24173 43 count = 23949 44 count = 23445 45 count = 22823 46 count = 22218 47 count = 21807 48 count = 21137 49 count = 20491 50 count = 19820 51 count = 19644 52 count = 19148 53 count = 18567 54 count = 18190 55 count = 17536 56 count = 16935 57 count = 16640 58 count = 15821 59 count = 15337 60 count = 14813 61 count = 14085 62 count = 13722 63 count = 13101 64 count = 12752 65 count = 12188 66 count = 11973 67 count = 11385 68 count = 11036 69 count = 10681 70 count = 10205 71 count = 9761 72 count = 9574 73 count = 9162 74 count = 9056 75 count = 8700 76 count = 8270 77 count = 8096 78 count = 7671 79 count = 7575 80 count = 7366 81 count = 7262 82 count = 7011 83 count = 6692 84 count = 6533 85 count = 6459 86 count = 5996 87 count = 5783 88 count = 5764 89 count = 5554 90 count = 5413 91 count = 5310 92 count = 5069 93 count = 5021 94 count = 5026 95 count = 4816 96 count = 4788 97 count = 4561 98 count = 4528 99 count = 4296 100 count = 4308 101 count = 4316 102 count = 4123 103 count = 4023 104 count = 3850 105 count = 3873 106 count = 3731 107 count = 3737 108 count = 3685 109 count = 3566 110 count = 3505 111 count = 3462 112 count = 3383 113 count = 3350 114 count = 3264 115 count = 3204 116 count = 3216 117 count = 3187 118 count = 3191 119 count = 3163 120 count = 2903 121 count = 3040 122 count = 2956 123 count = 2899 124 count = 2802 125 count = 2916 126 count = 2833 127 count = 2745 128 count = 2918 129 count = 2843 130 count = 2795 131 count = 2718 132 count = 2758 133 count = 2781 134 count = 2821 135 count = 2755 136 count = 2763 137 count = 2739 138 count = 2770 139 count = 2705 140 count = 2812 141 count = 2733 142 count = 2766 143 count = 2792 144 count = 2790 145 count = 2813 146 count = 2674 147 count = 2655 148 count = 2544 149 count = 2562 150 count = 2542 151 count = 2668 152 count = 2586 153 count = 2521 154 count = 2525 155 count = 2497 156 count = 2503 157 count = 2513 158 count = 2517 159 count = 2406 160 count = 2526 161 count = 2571 162 count = 2531 163 count = 2504 164 count = 2536 165 count = 2454 166 count = 2529 167 count = 2651 168 count = 2530 169 count = 2519 170 count = 2522 171 count = 2600 172 count = 2614 173 count = 2603 174 count = 2748 175 count = 2711 176 count = 2783 177 count = 2877 178 count = 2921 179 count = 2909 180 count = 2814 181 count = 2747 182 count = 2648 183 count = 2615 184 count = 2510 185 count = 2526 186 count = 2363 187 count = 2284 188 count = 2036 189 count = 2022 190 count = 1908 191 count = 1912 192 count = 1920 193 count = 1818 194 count = 1896 195 count = 1977 196 count = 2016 197 count = 2030 198 count = 2004 199 count = 1855 200 count = 1660 201 count = 1485 202 count = 1395 203 count = 1314 204 count = 1278 205 count = 1064 206 count = 899 207 count = 850 208 count = 847 209 count = 824 210 count = 834 211 count = 838 212 count = 839 213 count = 833 214 count = 913 215 count = 844 216 count = 807 217 count = 827 218 count = 837 219 count = 846 220 count = 889 221 count = 863 222 count = 871 223 count = 931 224 count = 909 225 count = 924 226 count = 950 227 count = 878 228 count = 895 229 count = 833 230 count = 909 231 count = 959 232 count = 870 233 count = 943 234 count = 915 235 count = 870 236 count = 897 237 count = 986 238 count = 925 239 count = 1003 240 count = 999 241 count = 1016 242 count = 1003 243 count = 1032 244 count = 1067 245 count = 1062 246 count = 1148 247 count = 1188 248 count = 1311 249 count = 1391 250 count = 1522 251 count = 1704 252 count = 2114 253 count = 2766 254 count = 4315 255 count = 39663 ***** Normalized std::array Histogram ***** 0 count = 0.00141101 1 count = 4.6651e-05 2 count = 5.16749e-05 3 count = 5.3828e-05 4 count = 5.09572e-05 5 count = 3.51676e-05 6 count = 4.80864e-05 7 count = 3.73208e-05 8 count = 5.59812e-05 9 count = 4.1627e-05 10 count = 4.30624e-05 11 count = 4.1627e-05 12 count = 4.73687e-05 13 count = 5.3828e-05 14 count = 6.17228e-05 15 count = 7.03353e-05 16 count = 7.53592e-05 17 count = 9.97613e-05 18 count = 0.00021603 19 count = 0.00039761 20 count = 0.000755028 21 count = 0.00111316 22 count = 0.00172752 23 count = 0.00257872 24 count = 0.00403208 25 count = 0.00584501 26 count = 0.00756535 27 count = 0.00885292 28 count = 0.0101168 29 count = 0.0113979 30 count = 0.0121651 31 count = 0.0128333 32 count = 0.0136006 33 count = 0.0139465 34 count = 0.0144151 35 count = 0.0148472 36 count = 0.0153352 37 count = 0.0156159 38 count = 0.0161125 39 count = 0.016714 40 count = 0.0168668 41 count = 0.0170943 42 count = 0.0173491 43 count = 0.0171884 44 count = 0.0168266 45 count = 0.0163802 46 count = 0.015946 47 count = 0.015651 48 count = 0.0151702 49 count = 0.0147065 50 count = 0.014225 51 count = 0.0140986 52 count = 0.0137427 53 count = 0.0133257 54 count = 0.0130551 55 count = 0.0125857 56 count = 0.0121544 57 count = 0.0119426 58 count = 0.0113548 59 count = 0.0110075 60 count = 0.0106314 61 count = 0.0101089 62 count = 0.00984838 63 count = 0.00940268 64 count = 0.0091522 65 count = 0.00874741 66 count = 0.00859311 67 count = 0.0081711 68 count = 0.00792062 69 count = 0.00766583 70 count = 0.0073242 71 count = 0.00700554 72 count = 0.00687133 73 count = 0.00657563 74 count = 0.00649956 75 count = 0.00624405 76 count = 0.00593544 77 count = 0.00581056 78 count = 0.00550553 79 count = 0.00543663 80 count = 0.00528663 81 count = 0.00521199 82 count = 0.00503184 83 count = 0.0048029 84 count = 0.00468878 85 count = 0.00463567 86 count = 0.00430337 87 count = 0.0041505 88 count = 0.00413686 89 count = 0.00398615 90 count = 0.00388495 91 count = 0.00381102 92 count = 0.00363806 93 count = 0.00360361 94 count = 0.0036072 95 count = 0.00345648 96 count = 0.00343638 97 count = 0.00327346 98 count = 0.00324978 99 count = 0.00308327 100 count = 0.00309188 101 count = 0.00309762 102 count = 0.00295911 103 count = 0.00288734 104 count = 0.00276317 105 count = 0.00277968 106 count = 0.00267777 107 count = 0.00268207 108 count = 0.00264475 109 count = 0.00255934 110 count = 0.00251556 111 count = 0.0024847 112 count = 0.002428 113 count = 0.00240432 114 count = 0.0023426 115 count = 0.00229953 116 count = 0.00230815 117 count = 0.00228733 118 count = 0.0022902 119 count = 0.00227011 120 count = 0.0020835 121 count = 0.00218183 122 count = 0.00212154 123 count = 0.00208063 124 count = 0.00201102 125 count = 0.00209283 126 count = 0.00203326 127 count = 0.00197011 128 count = 0.00209427 129 count = 0.00204044 130 count = 0.00200599 131 count = 0.00195073 132 count = 0.00197944 133 count = 0.00199594 134 count = 0.00202465 135 count = 0.00197728 136 count = 0.00198302 137 count = 0.0019658 138 count = 0.00198805 139 count = 0.0019414 140 count = 0.00201819 141 count = 0.00196149 142 count = 0.00198518 143 count = 0.00200384 144 count = 0.0020024 145 count = 0.00201891 146 count = 0.00191915 147 count = 0.00190551 148 count = 0.00182585 149 count = 0.00183877 150 count = 0.00182441 151 count = 0.00191484 152 count = 0.00185599 153 count = 0.00180934 154 count = 0.00181221 155 count = 0.00179211 156 count = 0.00179642 157 count = 0.0018036 158 count = 0.00180647 159 count = 0.0017268 160 count = 0.00181293 161 count = 0.00184523 162 count = 0.00181652 163 count = 0.00179714 164 count = 0.00182011 165 count = 0.00176125 166 count = 0.00181508 167 count = 0.00190264 168 count = 0.0018158 169 count = 0.0018079 170 count = 0.00181006 171 count = 0.00186604 172 count = 0.00187609 173 count = 0.00186819 174 count = 0.00197226 175 count = 0.0019457 176 count = 0.00199738 177 count = 0.00206484 178 count = 0.00209642 179 count = 0.00208781 180 count = 0.00201963 181 count = 0.00197154 182 count = 0.00190049 183 count = 0.0018768 184 count = 0.00180144 185 count = 0.00181293 186 count = 0.00169594 187 count = 0.00163924 188 count = 0.00146125 189 count = 0.0014512 190 count = 0.00136939 191 count = 0.00137226 192 count = 0.001378 193 count = 0.00130479 194 count = 0.00136077 195 count = 0.00141891 196 count = 0.0014469 197 count = 0.00145695 198 count = 0.00143829 199 count = 0.00133135 200 count = 0.00119139 201 count = 0.0010658 202 count = 0.0010012 203 count = 0.000943067 204 count = 0.00091723 205 count = 0.00076364 206 count = 0.000645219 207 count = 0.000610051 208 count = 0.000607898 209 count = 0.000591391 210 count = 0.000598568 211 count = 0.000601439 212 count = 0.000602156 213 count = 0.00059785 214 count = 0.000655267 215 count = 0.000605745 216 count = 0.00057919 217 count = 0.000593544 218 count = 0.000600721 219 count = 0.00060718 220 count = 0.000638042 221 count = 0.000619381 222 count = 0.000625123 223 count = 0.000668185 224 count = 0.000652396 225 count = 0.000663161 226 count = 0.000681822 227 count = 0.000630147 228 count = 0.000642348 229 count = 0.00059785 230 count = 0.000652396 231 count = 0.000688281 232 count = 0.000624405 233 count = 0.000676798 234 count = 0.000656702 235 count = 0.000624405 236 count = 0.000643783 237 count = 0.000707659 238 count = 0.000663879 239 count = 0.00071986 240 count = 0.000716989 241 count = 0.00072919 242 count = 0.00071986 243 count = 0.000740674 244 count = 0.000765794 245 count = 0.000762205 246 count = 0.000823928 247 count = 0.000852636 248 count = 0.000940914 249 count = 0.000998331 250 count = 0.00109235 251 count = 0.00122297 252 count = 0.00151723 253 count = 0.00198518 254 count = 0.00309691 255 count = 0.0284664 sum = 1 elapsed time: 2.59382 Computation finished at Mon Mar 3 14:01:19 2025 elapsed time: 3.14067 

TinyDIP on GitHub

All suggestions are welcome.

The summary information:

\$\endgroup\$

    1 Answer 1

    5
    \$\begingroup\$

    I saw one piece of code being repeated across two functions, maybe create a third function and call this function from those two functions.

    Also, you were accepting input array by value, better to take them by reference and avoid unnecessary copy.

    template<class ElementT, std::size_t Count, class ProbabilityType = double> constexpr std::array<ElementT, Count> get_normalized_input( const std::array<ElementT, Count>& input, const ProbabilityType& sum) { std::array<ProbabilityType, Count> output{}; for (std::size_t i = 0; i < Count; ++i) { output[i] = static_cast<ProbabilityType>(input[i]) / sum; } return output; } template<class ElementT, std::size_t Count, class ProbabilityType = double> constexpr static auto normalize_histogram(const std::array<ElementT, Count>& input) { auto sum = std::reduce(std::ranges::cbegin(input), std::ranges::cend(input)); return get_normalized_input(input, static_cast<ProbabilityType>(sum)); } // normalize_histogram template function implementation for std::array (with Execution Policy) template<class ExecutionPolicy, class ElementT, std::size_t Count, class ProbabilityType = double> requires(std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>) constexpr static auto normalize_histogram(ExecutionPolicy execution_policy, const std::array<ElementT, Count>& input) { auto sum = std::reduce(execution_policy, std::ranges::cbegin(input), std::ranges::cend(input)); return get_normalized_input(input, static_cast<ProbabilityType>(sum)); } 

    Also, I suggest you create a scope-based Timer class so that you can avoid repeating code for start and end times in your usage example code. The Timer class can be simple like capture start time in constructor and compute end time and difference in destructor.

    Also, since you have tagged the post as C++23, do try using std::print and std::format instead of using std::cout.

    \$\endgroup\$
    0

      Start asking to get answers

      Find the answer to your question by asking.

      Ask question

      Explore related questions

      See similar questions with these tags.