Я использую OpenCV 4.5.1 и меня очень смущает это условие: Поэтому я просто создаю новый объект Mat:
Mat model_Input = (Size(5, 1), CV_32FC1);
затем я пытаюсь ввести какое-то значение в A, используя Mat.at, например:
model_Input.at<float>(0, 0) = 1.0;
model_Input.at<float>(0, 1) = 2.0;
model_Input.at<float>(0, 2) = 3.0;
model_Input.at<float>(0, 3) = 4.0;
model_Input.at<float>(0, 4) = 5.0;
model_Input.at<float>(0, 5) = 6.0;
Кажется, код model_Input.at<float>(0, 5) = 6.0; выходит за пределы (Размер(5,1))?
Но в процессе компиляции не было обнаружено никаких ошибок, и проблем нет даже при отладке.
Matmodel_Input наверняка имеет только 5 значений, так как я пытаюсь его вычислить, но я не знаю, почему в этом коде нет ошибок?
вы создаете матрицу с именем A, а затем назначаете элементы другой матрице с именем model_Input. Пожалуйста, создайте минимальный воспроизводимый пример
@ 463035818_is_not_an_ai Я предположил, что это просто опечатка, когда реальный код был скопирован в вопрос. Я отредактирую.
@wohlstad ну, тем не менее, они должны получить ошибку для строки, где они ожидают ошибку из-за опечатки, которую вы упомянули в ответе
Компилятор C++ не обязан диагностировать, когда вы делаете что-то неправильно. Вам предстоит знать все правила и не нарушать их.





Фаза компиляции:
в процессе компиляции не было обнаружено ошибок
cv::Mat может иметь динамический размер. Его можно даже изменить после постройки, например. с cv::Mat::reshape и cv::Mat::resize.
Поэтому компилятор вообще не может обнаружить внешний доступ.
Что касается времени выполнения:
Доступ к данным за пределами границ обычно является Неопределённым поведением по стандарту C++. Это означает, что случиться может что угодно, включая (но не обязательно) аварию.
нет проблем даже при отладке
Я думаю это не правильно:
Хотя это никоим образом не требуется стандартом C++, если вы создаете свою программу с помощью opencv в режиме отладки, вы должны увидеть ошибку утверждения во время выполнения, потому что cv::Mat::at выполняет проверку границ в отладке:
Для повышения производительности проверки диапазона индексов выполняются только выполняется в конфигурации отладки.
У вас должно получиться что-то вроде следующего (я использую 4.8.0, но в вашей версии должно получиться что-то похожее):
OpenCV(4.8.0) Error: Assertion failed ((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels())) in cv::Mat::at, file C:\Dev\opencv-4.8.0-windows\build\include\opencv2\core\mat.inl.hpp, line 899
Примечание: Mat model_Input = (Size(5, 1), CV_32FC1); недопустимый синтаксис. У вас наверняка есть что-то вроде Mat model_Input(Size(5, 1), CV_32FC1);.
согласно документации at выполняет проверку границ в режиме отладки
@ 463035818_is_not_an_ai да, и это источник упомянутого мной утверждения. Я добавлю документацию для cv::Mat::at.
спасибо всем вам, ребята, Mat A — это действительно опечатка, моя вина. И я попробовал отладку, проблем нет, может быть есть еще какие-то детали, которые я не заметил.
@user12002570 user12002570 это конкретный вопрос о
cv::Mat. Пожалуйста, смотрите мой ответ ниже.