culagesvd() в CULA

Я хочу использовать culadgesvd() функция для вычисления SVD для матрицы. Мне не ясно, как на самом деле использовать его в C/C++ с информацией в документации. Кто-нибудь может дать мне полную маленькую программу на C, шаблон, чтобы показать, как в основном используется функция? Просто пара строк (с такими вещами, как culaInitialize() а также culaShutdown()), я просто хочу посмотреть, как эта функция может работать без ошибок.

1 ответ

Решение

Я думал, что SVD не входит в бесплатную версию (это все же). Ниже приведен пример разложения QR. Поместите это в файл.cpp:

#include<cula.h>
#include<iostream>

int main()
{       
    float x[] = {1, 2, 3, 4};
    int n_rows = 2, n_cols = 2;
    float scale[n_cols];

    culaInitialize();   
    culaSgeqrf(n_rows, n_cols, &(x[0]), n_rows, &(scale[0]));
    culaShutdown();

    for(int ii = 1; ii < n_rows; ii++)
    {
        for(int jj = 0; jj < n_cols; jj++)
        {
            if(ii > jj) { x[ii + jj * n_rows] *= scale[jj]; }
        }
    }

    for(int ii = 0; ii < n_rows * n_cols; ii++)
    {
        std::cout << x[ii] << std::endl;
    }

    return 0;
}

и скомпилируйте его, используя:

g++ -fPIC -c -I/usr/local/cula/include -Wl,-rpath,/usr/local/cula/lib64 -L/usr/local/cula/lib64 -lcula_lapack_basic gpuQR.cpp
g++ -o gpuQR gpuQR.o -Wl,-rpath,/usr/local/cula/lib64 -L/usr/local/cula/lib64 -lcula_lapack_basic

Затем вызовите программу, используя:

./gpuQR
-2.23607
0.894427
-4.91935
-0.894427

Проверьте мой пост о CULA и Rcpp здесь.

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