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:

asked Mar 3 at 6:21
\$\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.

answered Mar 3 at 9:42
\$\endgroup\$
0

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.