Любые примеры кода, показывающие, как решить несколько линейных уравнений в objC? - PullRequest
5 голосов
/ 29 ноября 2010

Существуют ли примеры кода для решения такой матрицы, как приведенная ниже, на платформе iPhone. На самом деле реальная матрица намного больше (около 100 переменных). Поскольку это простая линейная алгебра, я не могу думать, что код такой сложный, также я слышал о пакетах математической библиотеки и LAPACK, но не могу найти примеров, где они реализованы.

Если кто-нибудь знает какие-либо примеры или учебные пособия о том, как перейти от создания матрицы к решению каждой переменной, это будет очень признательно, благодаря тонне.

 ____            ____
|                    |
|  4   3  -1   |  2  |
| -2   3   8   |  0  |
|  0   2   6   | -1  |
|____            ____|

Ответы [ 2 ]

4 голосов
/ 29 ноября 2010

Не забывайте, что Objective-C - это C с кучей объектно-ориентированных расширений.Вы можете вставить любую библиотеку C в приложение iPhone, включая LAPACK.

Если вы хотите написать несколько классов-оберток Objective C для LAPACK, я уверен, что команда проекта LAPACK была бы очень рада принятьпатч.

3 голосов
/ 29 декабря 2011

Вот пример кода для решения линейных систем с помощью CLAPACK, реализации Apple LAPACK, которая доступна на iOS 4.0 и более поздних версиях.

#define N 3
#define NRHS 1
#define LDA N
#define LDB N

void solve_system() {
    __CLPK_integer n = N, nrhs = NRHS, lda = LDA, ldb = LDB, info;
    __CLPK_integer ipiv[N];

    __CLPK_real a[LDA * N] = {
        4, -2, 0,
        3, 3, 2,
        -1, 8, 6,
    };

    __CLPK_real b[LDB * NRHS] = {
        2, 0, -1,
    };

    // Solve A * x = b
    sgesv_(&n, &nrhs, a, &lda, ipiv, b, &ldb, &info);

    if(info > 0) {
        // A is singular; solution is not unique.
    }

    print_matrix(N, NRHS, b);
}

void print_matrix(size_t rows, size_t columns, __CLPK_real *mat) {
    for(size_t r = 0; r < rows; ++r) {
        for(size_t c = 0; c < columns; ++c) {
            printf("%6.2f ", mat[r * columns + c]);
        }
        printf("\n");
    }
}

Используется функция LAPACK SGESV, функция «драйвера» для решения линейных систем. Обратите внимание, что данные предоставляются в формате основных столбцов, поскольку LAPACK изначально был написан на языке FORTRAN, который хранит многомерные массивы в формате основных столбцов. __CLPK_integer и __CLPK_real являются typedefs для long и float соответственно.

...