Comparison of the characteristics of some EIZO monitors

#include <iostream> #include <string> #include <vector> #include <map> #include <algorithm> #include <cmath> #include <iomanip> using namespace std; template<class T> T max(const vector<T>& vals) { return *max_element(vals.begin(), vals.end()); }; float div_to_float(int a, int b) { return (float) a / (float) b; } struct EIZOMonitor { string model; float recommended_price_euro; float diagonal_cm; pair<int, int> resolution_pixels; float number_colors_million; int max_brightness_candela_per_m2; int max_dark_room_contrast_num_to_one; float gray_gray_response_time_ms; float power_usage_watts; }; int main() { // Rank monitors condering their technical attributes. // Creating an index where a higher value is better. float na = nan(""); vector<EIZOMonitor> monitors = { {"EV2785-BK", 1199.0, 68.50, {3840, 2160}, 16.7, 350, 1300, 5, 32.00}, {"EV2785-WT", 1199.0, 68.50, {3840, 2160}, 16.7, 350, 1300, 5, 32.00}, {"FS2735", 1099.0, 68.50, {2560, 1440}, 16.7, 350, 1000, 1, 33.0}, {"FS2434-BK", 349.0, 60.40, {1920, 1080}, 16.7, 250, 5000, 4.9, 15.0}, {"EV3237-BK", 1427.0, 79.90, {3840, 2160}, 16.7, 300, 1000, 5, 30.00}, {"EV2450-BK", 319.0, 60.40, {1920, 1080}, 16.7, 250, 1000, 5, 11.00}, {"CS2730", 1118.0, 68.40, {2560, 1440}, 1070.0, 350, 1000, 10, 44.00}, {"CS2420", 699.0, 61.10, {1920, 1200}, 1070.0, 350, 1000, 15, 26.00}, {"EV2455-BK", 499.0, 61.10, {1920, 1200}, 16.7, 300, 1000, 5, 13.00}, {"EV2750-BK", 811.0, 68.40, {2560, 1440}, 16.7, 350, 1000, 5, 22.00}, {"CG2730", 1931.0, 68.40, {2560, 1440}, 1070.0, 350, 1500, 13, 33.0}, {"CG318-4K", 4899.0, 78.90, {4096, 2160}, 1070.0, 350, 1500, 11, 54.00}, {"EV2750-WT", 811.0, 68.40, {2560, 1440}, 16.7, 350, 1000, 5, 22.00}, {"CG277-BK", 2199.0, 68.40, {2560, 1440}, 1070.0, 300, 1000, 6, 43.00}, {"CG2420", 1426.0, 61.10, {1920, 1200}, 1070.0, 400, 1500, 10, 20.00}, {"CG248-4K", 2449.0, 60.40, {3840, 2160}, 1070.0, 350, 1000, 14, 52.00}, {"CS230B-BK", 559.0, 58.40, {1920, 1080}, 16.7, 300, 1000, 11, 21.0}, {"EV2780-BK", 987.0, 68.40, {2560, 1440}, 16.7, 350, 1000, 5, 23.0}, {"EV2456-BK", 578.38, 61.10, {1920, 1200}, 16.7, 350, 1000, 5, 11.0}, {"CG247X", 1629.0, 61.10, {1920, 1200}, 1070, 400, 1500, 10, 22.0}, {"EV2216WFS3-BK", 232.0, 55.80, {1680, 1050}, 16.7, 250, 1000, na, 12.0}, {"EV3237-GY", 1427.0, 79.90, {3840, 2160}, 16.7, 300, 1000, 5, 30.0}, {"CG3145", na, 78.90, {4096, 2160}, 1070, 1000, 1000000, na, na}, {"EV2316WFS3-BK", 269.0, 58.40, {1920, 1080}, 16.7, 250, 1000, na, 14.0}, {"EV2730Q-BK", 998.0, 67.20, {1920, 1920}, 16.7, 300, 1000, 5, 25.00}, {"EV2451-BK", 395.67, 60.40, {1920, 1080}, 16.7, 250, 1000, 5, 13.00}, {"EV2780-WT", 987.0, 68.40, {2560, 1440}, 16.7, 350, 1000, 5, 23.00}, {"EV2450-GY", 319.0, 60.40, {1920, 1080}, 16.7, 250, 1000, 5, 11.0}, {"EV2416WFS3-BK", 339.0, 61.10, {1920, 1200}, 16.7, 250, 1000, na, 15.00}, {"EV2450-WT", 319.0, 60.40, {1920, 1080}, 16.7, 250, 1000, 5, 11.00}, {"RX850", na, 78.90, {4096, 2160}, 1070, 850, 1450, na, 111.0}, {"MX215", na, 54.00, {1200, 1600}, 1070, 420, 1500, na, 19.0}, {"EV2455-GY", 499.0, 61.10, {1920, 1200}, 16.7, 300, 1000, 5, 13.00}, {"S2133-BK", 832.0, 54.00, {1600, 1200}, 16.7, 420, 1500, 6, 13.00}, {"EV2455-WT", 499.0, 61.10, {1920, 1200}, 16.7, 300, 1000, 5, 13.00}, {"EV2451-WT", 395.67, 60.40, {1920, 1200}, 16.7, 250, 1000, 5, 13.00}, {"MX315W", na, 78.90, {4096, 2160}, 1070, 450, 1300, na, 67.00}, {"MX242W", na, 61.10, {1920, 1200}, 1070,350, 1000, na, 31.00}, {"EV2456-WT", 578.38, 61.10, {1920, 1200}, 16.7, 350, 1000, 5, 11.00}, {"T2381W-BK", 1059.0, 58.40, {1920, 1080}, 16.7, 260, 1000, 6, 18.00}, {"EV2216WFS3-GY", 232.0, 55.80, {1680, 1050}, 16.7, 250, 1000, na, 12.00}, {"DV4624", na, 117.0, {1920, 1080}, 16.7, 600, 4000, 6.5, 35.00}, {"S1934H-BK", 301.00, 48.0, {1280, 1024}, 16.7, 250, 1000, 14, 9.00}, {"FDF4627W-IP", na, 117.0, {1920, 1080}, 16.7, 700, 4000, 6.5, na}, {"FDF2304W-IP", na, 58.00, {1920, 1080}, 16.7, 300, 1000, 8, na}, {"RX650", na, 76.10, {3280, 2048}, 16.7, 800, 1000, na, 108.0}, {"EV2416WFS3-GY", 339.0, 61.10, {1920, 1200}, 16.7, 250, 1000, na, 15.00}, {"RX560-MD", na, 54.10, {2048, 2560}, 1070, 1100, 1500, na, 43.00}, {"RX440", na, 75.60, {2560, 1600}, 1070, 750, 1100, na, 84.00}, {"RX350", na, 54.10, {1536, 2048}, 1070, 1000, 1500, na, 46.00}, {"FDF2306W", na, 58.00, {1920, 1080}, 16.7, 250, 1000, na, 18.00}, {"MX191", 594.0, 48.10, {1280, 1024}, 16.7, 300, 2000,na, 26.00}, {"EV2316WFS3-GY", 269.0, 58.40, {1920, 1080}, 16.7, 250, 1000, na, 14.00}, {"RX250", na, 54.00, {1200, 1600}, 1070, 800, 1400, na, 38.00}, {"S2133-GY", 832.0, 54.00, {1600, 1200}, 16.7, 420, 1500, 6, 13.00}, {"RX660", na, 76.10, {3280, 2048}, 1070, 1000, 1500, na, 93.00}, {"GX550", na, 54.00, {2048, 2560}, 0.001024, 2000, 1500, na, 40.00}, {"MS235WT", na, 58.40, {1920, 1080}, 16.7, 260, 1000, na, 21.00}, {"S1934H-GY", 301.0, 48.00, {1280, 1024}, 16.7, 250, 1000, 14, 9.00}, {"FDS1703-BK", na, 43.00, {1280, 1024}, 16.7, 350, 800, na, na}, {"GX240", na, 54.00, {1200, 1600}, 0.001024, 1200, 1400, na, 29.00}, {"GX340", na, 54.00, {1536, 2048}, 0.001024, 1200, 1400, na, 36.00}, {"FDU2603WT", na, 65.00,{1920, 1200}, 16.7, 470, 1500, na, na}, {"FDS1903-BK", na, 48.00, {1280, 1024}, 16.7, 350, 1000, na, na}, {"MDF4601WT", na, 116.80, {1920, 1080}, 16.7, 620, 4000, 6.5, na}, {"FDF2305W", na, 58.00, {1920, 1080}, 16.7, 250, 1000, na, 18.00}, {"FDU2603W", na, 65.00, {1920, 1200}, 16.7, 490, 1500, na, na}, {"FDF2382WT", na, 58.00, {1920, 1200}, 16.7, 260, 1000, 11, 14.00}, {"FDS1904T", na, 48.00, {1280, 1024}, 16.7, 540, 2000, na, na}, {"FDS1904", na, 48.00, {1280, 1024}, 16.7, 590, 2000, na, na}, {"FDS1903-GY", na, 48.00, {1280, 1024}, 16.7, 350, 1000, na, na}, {"MS236WT", na, 58.40, {1920, 1080}, 16.7, 260, 1000, 11, 19.00}, {"FDS1703-GY", na, 43.00, {1280, 1024}, 16.7, 350, 800, na, na} }; vector<float> prices, diagonals, colors, powers, resp_times; vector<int> pixels, brightnesses, contrasts; for(const EIZOMonitor& monitor : monitors) { prices.push_back(monitor.recommended_price_euro); diagonals.push_back(monitor.diagonal_cm); colors.push_back(monitor.number_colors_million); powers.push_back(monitor.power_usage_watts); pixels.push_back(monitor.resolution_pixels.first * monitor.resolution_pixels.second); brightnesses.push_back(monitor.max_brightness_candela_per_m2); contrasts.push_back(monitor.max_dark_room_contrast_num_to_one); resp_times.push_back(monitor.gray_gray_response_time_ms); } float max_price = max(prices), max_diagonal = max(diagonals), max_colors = max(colors), max_power = max(powers), max_resp_time = max(resp_times); int max_pixels = max(pixels), max_brightness = max(brightnesses), max_contrast = max(contrasts); bool has_nan = false; vector<float> vals; vector<pair<string, float>> rank; float price_normalized, diagonal_normalized, colors_normalized, power_normalized, resp_time_normalized, pixels_normalized, brightness_normalized, contrast_normalized; for(const EIZOMonitor& monitor : monitors) { pair<int, int> pixel_res = monitor.resolution_pixels; int total_pixels = pixel_res.first * pixel_res.second; // Normalize all values (in range [0, 1]) price_normalized = monitor.recommended_price_euro / max_price; diagonal_normalized = monitor.diagonal_cm / max_diagonal; colors_normalized = monitor.number_colors_million / max_colors; power_normalized = monitor.power_usage_watts / max_power; resp_time_normalized = monitor.gray_gray_response_time_ms / max_resp_time; pixels_normalized = div_to_float(total_pixels, max_pixels); brightness_normalized = div_to_float(monitor.max_brightness_candela_per_m2, max_brightness); contrast_normalized = div_to_float(monitor.max_dark_room_contrast_num_to_one, max_contrast); has_nan = false; vals = {price_normalized, diagonal_normalized, colors_normalized, power_normalized, resp_time_normalized, pixels_normalized, brightness_normalized, contrast_normalized}; for(auto val : vals) { if(isnan(val)) {has_nan = true; break;} } if(has_nan) {continue;} float monitor_index_val = (diagonal_normalized * colors_normalized * pixels_normalized * brightness_normalized * contrast_normalized) / (price_normalized * power_normalized * resp_time_normalized); rank.push_back({monitor.model, monitor_index_val}); } sort(rank.begin(), rank.end(), [](pair<string, float> rank1, pair<string, float> rank2) {return rank1.second > rank2.second;}); for(auto [model, value] : rank) { cout<< setprecision(8) << fixed << value << " " << model <<endl; } /* 0.00280676 CG2420 0.00223363 CG247X 0.00171289 CS2420 0.00170025 CS2730 0.00151446 CG2730 0.00126362 CG277-BK 0.00119354 CG318-4K 0.00093207 CG248-4K 0.00090276 FS2434-BK 0.00036046 FS2735 0.00026397 EV2450-WT 0.00026397 EV2450-GY 0.00026397 EV2450-BK 0.00022910 EV2456-BK 0.00022910 EV2456-WT 0.00020009 EV2451-WT 0.00019932 EV2785-WT 0.00019932 EV2785-BK 0.00019259 EV2455-BK 0.00019259 EV2455-GY 0.00019259 EV2455-WT 0.00018008 EV2451-BK 0.00014888 S2133-GY 0.00014888 S2133-BK 0.00014633 EV2750-WT 0.00014633 EV2750-BK 0.00013739 EV3237-GY 0.00013739 EV3237-BK 0.00011501 EV2780-BK 0.00011501 EV2780-WT 0.00008812 EV2730Q-BK 0.00006134 S1934H-BK 0.00006134 S1934H-GY 0.00004161 CS230B-BK 0.00004072 T2381W-BK */ return 0; }

We see that the CG2420 has well-balanced characteristics, which leads it to generate the highest index value across all monitors which have all their attributes specified. But if we looked only at specific characteristics (e.g. response time), they might seem slightly disappointing. Here we assumed that all of them are equally important. This illustrates how self-generated indices can help us see the data in a different light, not necessarily giving the most intuitive/expected results. We could choose to rank almost any product this way if we could find a way to relate the attributes to each other. For more information about these particular models, visit EIZO's website.