Фильтрация входных данных

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

есть такой входной поток:

	Sensor 1	Sensor 2	Sensor 3	Sensor 4

#1	31, 53, 25, 	37, 46, 36, 	2, 17, 2, 	49, 94, 75, 
#2	27, 53, 27, 	27, 46, 37, 	16, 17, 2, 	64, 95, 51, 
#3	33, 53, 33, 	30, 46, 25, 	3, 17, 2, 	50, 95, 51, 
#4	35, 53, 37, 	37, 46, 35, 	2, 17, 2, 	63, 95, 51, 
#5	27, 53, 26, 	37, 46, 37, 	2, 17, 16, 	50, 95, 34, 
#6	27, 53, 27, 	37, 46, 37, 	2, 17, 12, 	50, 95, 51, 
#7	30, 53, 37, 	37, 46, 29, 	2, 17, 2, 	50, 95, 51, 
#8	8, 53, 1, 	27, 46, 19, 	11, 17, 2, 	57, 95, 51, 
#9	27, 53, 9, 	37, 46, 37, 	2, 17, 2, 	50, 95, 77, 
#10	29, 53, 27, 	25, 46, 33, 	16, 17, 2, 	47, 95, 51, 
#11	33, 53, 28, 	37, 46, 25, 	2, 17, 2, 	44, 95, 51, 
#12	31, 53, 27, 	28, 46, 30, 	2, 17, 2, 	50, 95, 52, 
#13	35, 54, 37, 	37, 46, 20, 	2, 17, 2, 	71, 95, 51, 
#14	27, 55, 27, 	37, 47, 37, 	2, 17, 2, 	76, 95, 51, 
#15	28, 57, 28, 	37, 46, 37, 	2, 17, 2, 	54, 95, 55, 
#16	28, 57, 28, 	37, 47, 38, 	2, 17, 2, 	51, 95, 51, 
#17	28, 55, 28, 	38, 47, 38, 	2, 17, 0, 	50, 95, 51, 
#18	21, 54, 23, 	37, 47, 26, 	2, 17, 2, 	69, 95, 51, 
#19	34, 54, 37, 	37, 47, 37, 	2, 17, 2, 	51, 96, 72, 
#20	0, 53, 27, 	28, 47, 37, 	16, 17, 2, 	51, 96, 68, 
#21	23, 53, 27, 	34, 46, 37, 	16, 17, 2, 	51, 96, 69, 
#22	27, 53, 27, 	26, 47, 25, 	16, 17, 2, 	69, 96, 51, 
#23	27, 53, 28, 	37, 47, 37, 	2, 17, 2, 	72, 96, 51, 
#24	27, 53, 28, 	37, 47, 37, 	2, 17, 16, 	51, 96, 47, 
#25	27, 53, 27, 	35, 47, 37, 	2, 17, 2, 	56, 96, 51, 
#26	31, 54, 34, 	37, 47, 32, 	2, 17, 2, 	51, 96, 24, 
#27	27, 53, 27, 	26, 47, 36, 	16, 17, 2, 	51, 96, 51, 
#28	31, 54, 37, 	37, 46, 28, 	2, 17, 2, 	67, 96, 46, 
#29	9, 53, 27, 	24, 46, 37, 	16, 17, 2, 	70, 96, 51, 
#30	27, 53, 25, 	37, 47, 37, 	2, 17, 2, 	51, 96, 67, 
#31	27, 53, 27, 	12, 47, 37, 	2, 17, 2, 	51, 96, 56, 
#32	37, 53, 7, 	19, 47, 31, 	2, 17, 2, 	51, 96, 70, 
#33	30, 54, 27, 	32, 47, 24, 	11, 17, 2, 	7, 96, 51, 
#34	28, 54, 37, 	36, 46, 26, 	2, 17, 2, 	25, 96, 10, 
#35	6, 54, 27, 	18, 47, 31, 	16, 17, 2, 	51, 96, 51, 
#36	27, 54, 24, 	37, 47, 37, 	2, 17, 16, 	51, 96, 61, 
#37	27, 54, 27, 	21, 47, 37, 	16, 17, 2, 	51, 96, 59, 
#38	35, 54, 29, 	23, 46, 27, 	2, 17, 2, 	46, 95, 16, 
#39	27, 53, 27, 	37, 46, 37, 	2, 17, 2, 	65, 96, 51, 
#40	27, 53, 27, 	37, 47, 37, 	2, 17, 16, 	51, 96, 15, 
#41	27, 53, 27, 	32, 47, 37, 	8, 17, 2, 	51, 96, 51, 
#42	35, 53, 35, 	37, 46, 25, 	2, 17, 2, 	54, 95, 53, 
#43	27, 53, 27, 	33, 46, 37, 	1, 17, 2, 	51, 95, 50, 
#44	37, 53, 13, 	22, 46, 20, 	2, 17, 2, 	51, 95, 51, 
#45	14, 53, 35, 	37, 46, 27, 	2, 17, 2, 	63, 95, 51, 
#46	33, 53, 37, 	37, 46, 36, 	2, 17, 2, 	71, 95, 51, 
#47	27, 53, 8, 	37, 46, 37, 	2, 17, 2, 	51, 95, 61, 
#48	12, 53, 27, 	26, 46, 37, 	2, 17, 12, 	51, 95, 76, 
#49	29, 53, 27, 	32, 46, 26, 	13, 17, 2, 	78, 95, 51, 
#50	27, 53, 26, 	33, 46, 37, 	2, 17, 3, 	51, 95, 65, 
#51	33, 53, 32, 	37, 47, 25, 	2, 17, 2, 	75, 95, 51, 
#52	27, 53, 27, 	37, 46, 36, 	2, 17, 2, 	59, 95, 41, 
#53	27, 53, 27, 	37, 46, 37, 	2, 17, 2, 	54, 95, 59, 
#54	27, 53, 27, 	35, 46, 37, 	2, 17, 4, 	51, 95, 52, 
#55	31, 53, 4, 	34, 46, 30, 	8, 17, 2, 	51, 95, 56, 
#56	37, 53, 4, 	33, 47, 22, 	1, 17, 2, 	3, 95, 50, 
#57	27, 53, 26, 	37, 46, 37, 	2, 17, 2, 	51, 95, 74, 
#58	33, 53, 27, 	26, 46, 31, 	16, 17, 2, 	62, 95, 51, 
#59	27, 53, 27, 	37, 47, 37, 	2, 17, 14, 	64, 95, 51, 
#60	29, 53, 35, 	37, 46, 32, 	2, 17, 2, 	51, 95, 30, 
#61	27, 53, 27, 	29, 46, 37, 	16, 17, 2, 	51, 95, 63, 
#62	0, 53, 27, 	23, 46, 15, 	16, 17, 2, 	51, 95, 69, 
#63	19, 53, 27, 	26, 47, 26, 	16, 17, 2, 	61, 95, 51, 
#64	26, 53, 33, 	37, 46, 31, 	2, 17, 2, 	51, 95, 58, 
#65	13, 53, 27, 	31, 46, 37, 	16, 17, 2, 	52, 95, 51, 
#66	30, 53, 13, 	36, 46, 27, 	2, 17, 2, 	73, 95, 51, 
#67	27, 53, 24, 	37, 46, 36, 	2, 17, 2, 	75, 95, 51, 
#68	27, 53, 27, 	35, 46, 37, 	2, 17, 14, 	51, 95, 15, 
#69	27, 53, 27, 	37, 46, 36, 	2, 17, 2, 	59, 95, 42, 
#70	27, 53, 27, 	29, 46, 37, 	16, 17, 2, 	51, 95, 51, 
#71	29, 53, 31, 	36, 46, 27, 	2, 17, 2, 	63, 95, 51, 
#72	27, 53, 33, 	37, 47, 37, 	2, 17, 15, 	51, 95, 64, 
#73	37, 53, 28, 	34, 46, 4, 	9, 17, 2, 	51, 95, 66, 
#74	3, 53, 27, 	23, 47, 29, 	2, 17, 2, 	51, 95, 44, 
#75	27, 53, 27, 	37, 46, 37, 	2, 17, 16, 	62, 95, 51, 
#76	30, 53, 33, 	37, 46, 32, 	2, 17, 2, 	69, 95, 51, 
#77	27, 53, 27, 	37, 46, 37, 	2, 17, 14, 	65, 95, 51, 
#78	29, 53, 32, 	37, 46, 37, 	2, 17, 16, 	51, 95, 72, 
#79	37, 53, 8, 	9, 46, 21, 	16, 17, 2, 	51, 95, 53, 
#80	4, 53, 27, 	26, 46, 36, 	16, 17, 2, 	51, 95, 47, 
#81	27, 53, 27, 	35, 46, 37, 	10, 17, 2, 	55, 95, 51, 
#82	26, 53, 28, 	37, 46, 37, 	2, 17, 2, 	51, 95, 56, 
#83	27, 53, 27, 	37, 46, 37, 	2, 17, 2, 	44, 95, 51, 
#84	27, 53, 27, 	37, 46, 37, 	2, 17, 16, 	51, 95, 18, 
#85	27, 53, 24, 	37, 46, 37, 	2, 17, 2, 	54, 95, 54, 
#86	27, 53, 27, 	37, 46, 37, 	2, 17, 16, 	39, 95, 11, 
#87	31, 53, 27, 	27, 46, 37, 	16, 17, 2, 	58, 95, 51, 
#88	27, 53, 29, 	37, 46, 37, 	2, 17, 15, 	51, 95, 70, 
#89	0, 53, 27, 	30, 46, 37, 	16, 17, 2, 	51, 95, 67, 
#90	20, 53, 27, 	30, 46, 37, 	16, 17, 2, 	54, 95, 51, 
#91	28, 53, 5, 	23, 46, 28, 	2, 17, 2, 	51, 95, 51, 
#92	30, 53, 27, 	29, 47, 22, 	0, 17, 2, 	51, 95, 55, 
#93	33, 53, 34, 	37, 46, 36, 	2, 17, 2, 	49, 95, 51, 
#94	26, 53, 33, 	37, 46, 28, 	2, 17, 2, 	66, 95, 51, 
#95	31, 53, 0, 	26, 46, 31, 	7, 17, 2, 	68, 95, 51, 
#96	27, 53, 27, 	37, 46, 37, 	2, 17, 16, 	50, 95, 63, 
#97	27, 53, 27, 	12, 46, 37, 	2, 17, 12, 	39, 95, 51, 
#98	36, 53, 35, 	37, 46, 31, 	2, 17, 2, 	70, 95, 51, 
#99	27, 53, 20, 	37, 46, 37, 	2, 17, 14, 	54, 95, 51, 
#100	26, 53, 35, 	37, 46, 33, 	2, 17, 2, 	67, 95, 51, 
#101	26, 53, 33, 	37, 46, 34, 	2, 17, 2, 	64, 95, 51, 
#102	27, 53, 17, 	37, 46, 37, 	2, 17, 2, 	51, 95, 68, 
#103	27, 53, 27, 	25, 46, 37, 	16, 17, 2, 	51, 95, 73, 
#104	37, 53, 33, 	37, 46, 36, 	2, 17, 2, 	60, 95, 61, 
#105	27, 53, 27, 	37, 46, 37, 	2, 17, 2, 	49, 95, 39, 
#106	27, 53, 10, 	37, 46, 36, 	2, 17, 2, 	73, 95, 51, 
#107	27, 53, 27, 	37, 46, 37, 	2, 17, 2, 	50, 95, 64, 
#108	27, 53, 27, 	28, 46, 37, 	16, 17, 2, 	57, 95, 51, 
#109	27, 53, 27, 	37, 46, 37, 	2, 17, 1, 	51, 95, 51, 
#110	26, 53, 34, 	37, 46, 37, 	2, 17, 16, 	40, 95, 51, 
#111	31, 53, 37, 	37, 46, 32, 	2, 17, 2, 	60, 95, 51, 
#112	25, 53, 34, 	37, 47, 37, 	2, 17, 16, 	51, 95, 73, 
#113	30, 53, 27, 	33, 46, 26, 	12, 17, 2, 	51, 95, 50, 
#114	35, 53, 37, 	37, 46, 36, 	2, 17, 2, 	38, 95, 51, 
#115	35, 53, 37, 	37, 47, 29, 	2, 17, 2, 	55, 95, 49, 
#116	27, 53, 27, 	34, 46, 37, 	2, 17, 2, 	51, 95, 51, 
#117	27, 53, 27, 	27, 46, 33, 	16, 17, 2, 	68, 95, 51, 
#118	27, 53, 27, 	37, 47, 37, 	2, 17, 16, 	51, 95, 64, 
#119	4, 53, 27, 	3, 46, 37, 	2, 17, 16, 	51, 95, 72, 
#120	29, 53, 27, 	31, 46, 27, 	14, 17, 2, 	51, 95, 63, 
#121	35, 53, 37, 	37, 46, 27, 	2, 17, 2, 	63, 95, 51, 
#122	27, 53, 25, 	37, 46, 37, 	2, 17, 2, 	51, 95, 62, 
#123	27, 53, 27, 	28, 46, 37, 	16, 17, 2, 	51, 95, 50, 
#124	8, 53, 6, 	24, 46, 34, 	16, 17, 2, 	72, 95, 51, 
#125	27, 53, 24, 	37, 46, 37, 	2, 17, 2, 	51, 95, 70, 
#126	27, 53, 27, 	31, 46, 37, 	16, 17, 2, 	59, 95, 51, 
#127	27, 53, 23, 	37, 46, 37, 	2, 17, 2, 	51, 95, 71, 
#128	9, 53, 27, 	0, 46, 37, 	2, 17, 15, 	51, 95, 71, 
#129	3, 53, 27, 	21, 46, 37, 	10, 17, 2, 	50, 95, 51, 
#130	29, 53, 0, 	26, 46, 36, 	16, 17, 2, 	50, 95, 51, 
#131	30, 53, 37, 	37, 46, 28, 	2, 17, 2, 	65, 95, 45, 
#132	27, 53, 26, 	37, 46, 37, 	2, 17, 16, 	51, 95, 64, 
#133	33, 53, 27, 	34, 46, 25, 	1, 17, 2, 	51, 95, 57, 
#134	35, 53, 33, 	37, 46, 36, 	2, 17, 2, 	60, 95, 51, 
#135	27, 53, 26, 	33, 46, 37, 	16, 17, 2, 	51, 95, 55, 
#136	27, 53, 27, 	30, 46, 37, 	16, 17, 2, 	68, 95, 51, 
#137	27, 53, 33, 	37, 47, 37, 	2, 17, 16, 	51, 95, 30, 
#138	27, 53, 27, 	34, 46, 37, 	8, 17, 2, 	51, 95, 42, 
#139	34, 53, 10, 	23, 46, 36, 	16, 17, 2, 	51, 95, 1, 
#140	27, 53, 27, 	34, 47, 37, 	2, 17, 12, 	51, 95, 2, 
#141	27, 53, 23, 	37, 46, 36, 	2, 17, 2, 	32, 95, 51, 
#142	27, 53, 0, 	37, 46, 10, 	2, 17, 2, 	69, 95, 51, 
#143	27, 53, 28, 	37, 46, 37, 	2, 17, 16, 	51, 95, 76, 
#144	0, 53, 27, 	26, 46, 27, 	3, 17, 2, 	46, 95, 51, 
#145	27, 53, 18, 	37, 46, 37, 	2, 17, 2, 	51, 95, 70, 
#146	14, 53, 27, 	35, 46, 37, 	2, 17, 5, 	51, 95, 52, 
#147	29, 53, 29, 	37, 47, 37, 	2, 17, 2, 	51, 95, 81, 
#148	31, 53, 27, 	27, 46, 37, 	16, 17, 2, 	51, 95, 69, 
#149	6, 53, 27, 	28, 46, 28, 	2, 17, 2, 	70, 95, 51, 
#150	27, 53, 26, 	37, 46, 37, 	2, 17, 7, 	51, 95, 67, 
#151	34, 53, 27, 	36, 47, 27, 	2, 17, 2, 	51, 95, 40, 
#152	17, 53, 27, 	28, 46, 33, 	16, 17, 2, 	69, 95, 51, 
#153	26, 53, 36, 	37, 46, 37, 	2, 17, 16, 	51, 95, 65, 
#154	12, 53, 27, 	34, 46, 37, 	2, 17, 7, 	44, 95, 48, 
#155	29, 53, 0, 	26, 46, 36, 	16, 17, 2, 	51, 95, 51, 
#156	26, 53, 28, 	37, 46, 30, 	2, 17, 2, 	55, 95, 51, 
#157	27, 53, 27, 	37, 46, 37, 	2, 17, 2, 	67, 95, 51, 
#158	27, 53, 26, 	37, 46, 36, 	2, 17, 2, 	60, 95, 51, 
#159	27, 53, 8, 	37, 46, 37, 	2, 17, 2, 	49, 95, 65, 
#160	20, 53, 27, 	27, 46, 37, 	16, 17, 2, 	50, 95, 51, 
#161	3, 53, 4, 	33, 46, 25, 	2, 17, 2, 	51, 95, 57, 
#162	30, 53, 27, 	32, 46, 26, 	13, 17, 2, 	74, 95, 51, 
#163	27, 53, 1, 	37, 46, 36, 	2, 17, 2, 	76, 95, 51, 
#164	27, 53, 21, 	37, 47, 37, 	2, 17, 16, 	51, 95, 36, 
#165	27, 53, 27, 	37, 46, 37, 	2, 17, 16, 	50, 95, 50, 
#166	27, 53, 26, 	37, 47, 37, 	2, 17, 2, 	50, 95, 70, 
#167	23, 53, 27, 	28, 46, 37, 	13, 17, 2, 	51, 95, 55, 
#168	30, 53, 29, 	37, 47, 20, 	2, 17, 2, 	61, 95, 51, 
#169	27, 53, 27, 	33, 46, 37, 	2, 17, 2, 	51, 95, 62, 
#170	27, 53, 17, 	36, 46, 4, 	15, 17, 2, 	71, 95, 51, 
#171	27, 53, 27, 	37, 46, 37, 	2, 17, 2, 	51, 95, 65, 
#172	32, 53, 27, 	27, 46, 37, 	9, 17, 2, 	51, 95, 35, 
#173	31, 53, 27, 	35, 46, 26, 	9, 17, 2, 	68, 95, 51, 
#174	27, 53, 27, 	37, 46, 37, 	2, 17, 2, 	78, 95, 51, 
#175	27, 53, 27, 	37, 46, 37, 	2, 17, 2, 	76, 95, 51, 
#176	27, 53, 27, 	33, 46, 37, 	2, 17, 3, 	51, 95, 18, 
#177	27, 53, 27, 	37, 46, 36, 	2, 17, 2, 	63, 95, 54, 
#178	27, 53, 27, 	26, 46, 36, 	16, 17, 2, 	51, 95, 65, 
#179	27, 53, 27, 	23, 46, 32, 	2, 17, 2, 	20, 95, 51, 
#180	27, 53, 25, 	37, 46, 25, 	2, 17, 2, 	51, 95, 53, 
#181	35, 53, 19, 	36, 46, 20, 	2, 17, 2, 	51, 95, 52, 
#182	26, 53, 29, 	37, 46, 37, 	2, 17, 2, 	51, 95, 66, 
#183	27, 53, 27, 	29, 46, 36, 	16, 17, 2, 	51, 95, 51, 
#184	28, 53, 7, 	35, 46, 27, 	2, 17, 2, 	51, 95, 42, 
#185	27, 53, 27, 	22, 46, 37, 	16, 17, 2, 	51, 95, 57, 
#186	22, 53, 27, 	26, 46, 33, 	16, 17, 2, 	54, 95, 51, 
#187	31, 53, 37, 	37, 46, 28, 	2, 17, 2, 	70, 95, 51, 
#188	27, 53, 27, 	37, 47, 37, 	2, 17, 16, 	51, 95, 80, 
#189	31, 53, 27, 	25, 46, 36, 	16, 17, 2, 	69, 95, 51, 
#190	27, 53, 27, 	36, 46, 37, 	2, 17, 6, 	51, 95, 63, 
#191	2, 53, 27, 	26, 47, 37, 	16, 17, 2, 	51, 95, 65, 
#192	27, 53, 27, 	22, 46, 32, 	2, 17, 2, 	2, 95, 51, 
#193	25, 53, 34, 	37, 46, 37, 	2, 17, 2, 	51, 95, 62, 
#194	27, 53, 27, 	31, 46, 37, 	16, 17, 2, 	51, 95, 59, 
#195	11, 53, 3, 	28, 46, 37, 	11, 17, 2, 	51, 95, 69, 
#196	26, 53, 27, 	29, 46, 4, 	16, 17, 2, 	51, 95, 70, 
#197	18, 53, 27, 	35, 46, 37, 	2, 17, 7, 	51, 95, 19, 
#198	27, 53, 27, 	36, 46, 37, 	2, 17, 6, 	51, 95, 54, 
#199	27, 53, 26, 	37, 46, 37, 	2, 17, 2, 	49, 95, 71, 
#200	27, 53, 27, 	28, 46, 37, 	16, 17, 2, 	55, 95, 55, 

Как можно выделить из этого два наиболее встречающихся числа из трех, для каждого сенсора?
Т.е. в данном случае получить тройки [*, 53, 27], [*, 46, 37], [2, 17 *], [*, 95, 51].

Сейчас используется среднее арифметическое, но из-за случайных всплесков отклонение от эталона получается более 3 единиц, что не устраивает: получается [25, 53, 25], [32, 46, 33], [5, 17, 4], [54, 95, 52]. 

#define DELTA 4 // допустимая погрешность
#define compare(etalon,value) ((etalon<(value+DELTA))&&(etalon>=(value-DELTA)))?(true):(false)
// возвращает true если цвет сенсора находится в заданном диапазоне
// value - значение с сенсора, etalon - цветовая константа
boolean matchSensor[4]={
  false,false,false,false  };  // признак совпадения цвета с эталоном для датчиков 1-4

void loop()
{
  readSensor(SENSOR1_OUT);          // получаем компоненты R, G, B с первого сенсора 
  matchSensor[0] = compareColor(etalonSensor1[0], etalonSensor1[1], etalonSensor1[2]); // проверяем совпадение с эталоном

  readSensor(SENSOR2_OUT);          // получаем компоненты R, G, B с первого сенсора 
  matchSensor[1] = compareColor(etalonSensor2[0], etalonSensor2[1], etalonSensor2[2]); // проверяем совпадение с эталоном


  readSensor(SENSOR3_OUT);          // получаем компоненты R, G, B с первого сенсора 
  matchSensor[2] = compareColor(etalonSensor3[0], etalonSensor3[1], etalonSensor3[2]); // проверяем совпадение с эталоном

  readSensor(SENSOR4_OUT);          // получаем компоненты R, G, B с первого сенсора 
  matchSensor[3] = compareColor(etalonSensor4[0], etalonSensor4[1], etalonSensor4[2]); // проверяем совпадение с эталоном
}

boolean compareColor(byte etalonRColor, byte etalonGColor, byte etalonBColor)
{
  boolean rColor = compare(etalonRColor,rawSensor[0]);
  boolean gColor = compare(etalonGColor,rawSensor[1]);
  boolean bColor = compare(etalonBColor,rawSensor[2]);
  byte result = rColor + gColor + bColor;
  if (result >= 2) return true;   // если хотя есть бы два совпадения, то считаем что шар совпадает с эталоном
  else return false;
}

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Легко.
Заведи массив, скажем 3 на 50... и увеличивай каждую ячейку. Типа принял с датчика 32,17,45.... значит в 1-32 увелим на 1 и 2-17 плюс 1 и 3-45 на 1...
А потом просто посмотрим какая ячейка в кпждом ряде больше остальных в этом же ряду...

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

1. Не нашел в алгоритме "среднего арифметического", тогда зачем мозг пудрить? (риторический)

2. Почему здесь сравнение с эталоном, а не то, что написано в условии задачи "выделить из этого два наиболее встречающихся числа из трех, для каждого сенсора"?

3. Если рассматривать только одно условие задачи, а именно "выделить из этого два наиболее встречающихся числа из трех, для каждого сенсора", то фактически необходимо найти для каждой колонки число с максимальной частотой появления и выбрать из каждой тройки два наиболее часто встречающихся, так?

4. Следующее неизвестное: обработка идет неспешно, либо в живом потоке данных? Если второе, то частота по всему потоку, либо по скользящему окну (тогда размер окна нужен)?

5. Не описан дипазон значений в каждой колонке. Можно предполагать, что это 0-100, но не факт, а от этого может зависеть решение, памяти то не совсем "дофига".

Если решать задачу в лоб, то тупой БПФ по каждому столбцу, потом собираем максимумы и получаем ответ. Но этот вариант медленный и жрет памяти немало (впрочем это еще пока неизвестно).

Еще, можно ли обрабатывать столбцы раздельно? Т.е. сначала пробежаться по левому столбцу, потом по следующему и т.п.? В этом случае можно съэкономить памяти, но тогда потратим больше времени.

Это всё так, навскидку, пока что слишком много неясного в условии задачи.

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Для определения "эталона" (два наиболее встречающихся числа для каждого сенсора) допустимо потратить и 200 циклов измерений (т.е. из 200 чисел в каждой колонке найти для каждой колонки число с максимальной частотой появления и выбрать из каждой тройки два наиболее часто встречающихся, , а при дальнейшем анализе поступающих данных (для сравнения с эталоном) лучше ограничиться выборкой из 10-20 измерений, т.к. такие тройки чисел поступают 5-10 раз в секунду, чтобы получать результат с минимальной задержкой.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Т.е. фактически сначала идет подготовительная часть, где производится поиск эталона. А потом, порциями, приходят данные, которые мы фильтруем эталоном, а остальные отбрасываем, впрочем эта часть есть в виде кода, не важно.

Тогда, если идем по колонкам, то получается достаточно просто:
1. Очищаем массив максимумов (обнуляем)
2. Берем число из колонки и используем его как индекс в массиме максимумов (что и писал Пухлявый), т.е. значение в массиве максимумов с этим индексом увеличиваем на 1.
3. После этого цикла находим максимум в массиве максимумов и запоминаем. Затем переходим к следующей колонке.

Далее берём эти максимумы тройками и в каждой тройке берем два максимально встречающихся значения. Эталон найден.

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Спасибо, поэкспериментирую.
А фильтр Калмана тут можно использовать?http://habrahabr.ru/post/166693/

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Увы, тут я не помощник. Здесь нужно понимать какие данные на входе и какие ошибки могут возникать. Собрать статистику, попробовать. Но это вроде бы очевидно.
Я бы ещё порылся в инете по фильтрации, если она действительно нужна.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Положение спас медианный фильтр, при глубине 10-20 итераций все лишнее замечательно отсекается, хоть и возникает небольшая инерционность при реалтайм обработке. Код был взят из этой темы, автор - гуру этого форума leshak, спасибо ему.

До Калмана так и не дошло. Попутно в сторонних библиотеках были найдены функции digitalSmooth и find_similar, но до них тоже дело не дошло  :)