Как сравнить Eigen:Arrays по строкам, но неупорядоченно? ⇐ C++
-
Anonymous
Как сравнить Eigen:Arrays по строкам, но неупорядоченно?
Я пишу модульный тест для функции, которая вычисляет собственный массив из 4 векторов-строк размера 2. Я хотел бы проверить, примерно ли он равен ожидаемому результату, но строки не обязательно должны появляться в тот же порядок. Поэтому для каждой строки фактического вывода я хочу проверить, соответствует ли она какой-то строке ожидаемого вывода.
Итак, это мой тест
Eigen::Array ожидаемый результат {{-14.1421356F, -14.1421356F}, {-28.2842712F, 28.2841712F}, {14.1421356Ф, 14.1421356Ф}, {28,2842712F, -28,284172F}}; Eigen::Array result = myFunction(); for (int rowIndex = 0; rowIndex < 4; rowIndex++) { // Проверяем, соответствует ли каждая строка результата какой-либо другой строке ожидаемого результата, // не обязательно по порядку. // @todo находим менее неуклюжий способ Bool FoundMatch = ложь; for (int сравнениеRowIndex = 0; сравнениеRowIndex < 4; сравнениеRowIndex++) { если (result.row(rowIndex).isApprox(expectedResult.row(comparisonRowIndex), ДОПУСК)) { FoundMatch = Истина; } } EXPECT_TRUE (найденное совпадение); } Это неудовлетворительно, и я думаю, что мне наверняка удастся каким-то образом использовать конструкцию any() Эйгена, но я до сих пор не понял, почему. Это мой лучший снимок, который, однако, не сработал
for (int rowIndex = 0; rowIndex < 4; rowIndex++) { EXPECT_TRUE(expectedResult.rowwise().isApprox(result.row(rowIndex), TOLERANCE).any()); // НЕПРАВИЛЬНЫЙ }
Я пишу модульный тест для функции, которая вычисляет собственный массив из 4 векторов-строк размера 2. Я хотел бы проверить, примерно ли он равен ожидаемому результату, но строки не обязательно должны появляться в тот же порядок. Поэтому для каждой строки фактического вывода я хочу проверить, соответствует ли она какой-то строке ожидаемого вывода.
Итак, это мой тест
Eigen::Array ожидаемый результат {{-14.1421356F, -14.1421356F}, {-28.2842712F, 28.2841712F}, {14.1421356Ф, 14.1421356Ф}, {28,2842712F, -28,284172F}}; Eigen::Array result = myFunction(); for (int rowIndex = 0; rowIndex < 4; rowIndex++) { // Проверяем, соответствует ли каждая строка результата какой-либо другой строке ожидаемого результата, // не обязательно по порядку. // @todo находим менее неуклюжий способ Bool FoundMatch = ложь; for (int сравнениеRowIndex = 0; сравнениеRowIndex < 4; сравнениеRowIndex++) { если (result.row(rowIndex).isApprox(expectedResult.row(comparisonRowIndex), ДОПУСК)) { FoundMatch = Истина; } } EXPECT_TRUE (найденное совпадение); } Это неудовлетворительно, и я думаю, что мне наверняка удастся каким-то образом использовать конструкцию any() Эйгена, но я до сих пор не понял, почему. Это мой лучший снимок, который, однако, не сработал
for (int rowIndex = 0; rowIndex < 4; rowIndex++) { EXPECT_TRUE(expectedResult.rowwise().isApprox(result.row(rowIndex), TOLERANCE).any()); // НЕПРАВИЛЬНЫЙ }
Мобильная версия