Свам Армадилло дать некоторые значения NaN

Я открываю Armadillo пакет для выполнения SVD на изображении. Я сначала попробую с OpenCV что очень очень медленно. Итак, сейчас я пишу пример, который выполняет SVD используя эту новую библиотеку, и я не получаю такой же результат, как OpenCV, После некоторых исследований, кажется, это связано с Lapack, который больше не используется OpenCV но все же Armadillo, Поэтому я восстанавливаю изображение после SVD вычисление, чтобы проверить, верну ли я исходное изображение. С OpenCV это нормально, разница близка к 0, но я не знаю, почему для Armadillo у меня есть NaN число как единственное число, поэтому я не могу вернуть изображение.

Заранее благодарю за любую помощь / совет, который вы можете принести.

Мой код C++:

int main()
{
    // Load the image
    cv::Mat img = cv::imread("path/to/the/image.png", 0);
    img.convertTo(img, CV_32FC1);

    // Convert cv::Mat to arma::fmat
    arma::fmat arma_img(reinterpret_cast<float*>(img.data), img.cols, img.rows);

    // Check if the image back from armadillo is okay
    cv::Mat opencv_img(arma_img.n_cols, arma_img.n_rows, CV_32FC1, arma_img.memptr());

    // ------ Perform SVD with OpenCV (2.5s)
    cv::SVD svvd;
    cv::Mat w1, U1, V1t;
    svvd.compute(opencv_img, w1, U1, V1t);

    cv::Mat W1 = cv::Mat::zeros(w1.rows, w1.rows, CV_32FC1);
    for (int i = 0; i<w1.rows; i++)
    {
        W1.at<float>(i, i) = w1.at<float>(i);
    }
    cv::Mat opencv_img_result = U1 * W1 * V1t;

    // ------ Perform SVD with Armadillo (0.05s)
    arma::fmat U2, V2;
    arma::fvec w2;
    arma::svd(U2, w2, V2, arma_img);

    arma::fmat W2 = arma::zeros<arma::fmat>(arma_img.n_rows, arma_img.n_cols);
    for (int i = 0; i < arma_img.n_cols; i++)
    {
        *(W2.memptr() + i * (1 + arma_img.n_rows)) = *(w2.memptr() + i);
    }
    arma::fmat arma_img_result = U2 * W2* V2.t();

    return 0;
}

1 ответ

Решение

Проблема из-за режима расчета:

Аргумент метода является необязательным; Метод либо "DC" или "STD"

"dc" indicates divide-and-conquer method (default setting)
"std" indicates standard method
the divide-and-conquer method provides slightly different results than the standard method, but is considerably faster for large

матрицы

dc режим не работает должным образом, но std один. Может быть, что-то не так в библиотеке Лапака dc Режим.

Другие вопросы по тегам