Умножение двух матриц с использованием указателей в C ++ - PullRequest
0 голосов
/ 27 апреля 2020

Я хочу умножить матрицы, используя указатели, которые я видел по целому rnet. Но то, что я не видел, это как сделать это только с двумя циклами for. Все решения, которые я видел, состояли из трех циклов for. Я открыл еще один вопрос по этому поводу, но он был закрыт из-за дублирования, но на мой вопрос там не было ответа.

Возможно, мне следовало привести пример моего кода:

for(i = 0; i < size; ++i)
    for(j = 0; j < size; ++j)
        {
            *((*PRODUCT)+i) += *((*A)+j) * *((*B)+size*j+i);
        }

This это то, что я сделал Он использует указатели для доступа к элементам матрицы. Но это не работает ...

1 Ответ

2 голосов
/ 27 апреля 2020

Вот умножение наивной матрицы с использованием указателей и двух for циклов. Обратите внимание, что он выполняет ту же работу, что и обычная реализация с тремя l oop. Он просто объединяет два внешних цикла в один и вычисляет индексы i и j.

void multiply(const float *A, const float *B, float *result, int N) // square N*N matrixes
{
    // combine two outer loops into one
    for (int n = 0, size = N * N; n < size; ++n) {

        // compute i and j indexes
        int i = n / N;
        int j = n % N;

        // inner loop
        float temp = 0;
        for (int k = 0; k < N; ++k) {
            temp += A[i * N + k] * B[k * N + j];
        }
        result[i * N + j] = temp;
    }
}

int main()
{
    int N = 42;
    float *A = new float[N * N];
    float *B = new float[N * N];
    float *C = new float[N * N];

    // give A and B some values...

    multiply(A, B, C, N);
}

Я использовал обозначение массива, потому что A[i * N + k] легче читать, чем *(A + i * N + k)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...