Почему индексирование массива Q [j] не работает после того, как я вызвал его с помощью Q ++ в C? - PullRequest
0 голосов
/ 02 августа 2020

Это небольшая проблема с одной строкой.

У меня эта строка кода работает некорректно, потому что я использовал Q++ раньше.

Если вы посмотрите на этот код

Q[j] += *Q * *Q; //  Power^2 -> Sum to the top row at column index j

Это дает **** обнаружение разрушения стека **: завершено ошибка.

Почему? Это потому, что я раньше использовал Q++? Итак, если я дважды звонил Q++, тогда, когда я звоню Q[0], я точно звоню Q[2]?

Когда я звоню Q[j], я хочу поместить значение в row 0 в столбце j, который находится между 0 и Pcolumn. Как я могу это сделать?

Подсказка:

Если вы замените этот код:

Q[j] += *Q * *Q; //  Power^2 -> Sum to the top row at column index j

На

 *Q = *Q * *Q; //  Power^2 

Это то же самое, что и MATLAB: Q = power (P-repmat (Q, 1, size (P, 2)), 2)

Как повторить эту проблему:

#include <stdio.h>
#include <stdint.h>

#define Pcolumns 10
#define Prows 3

// Repeat, substract, power and then sum
// MATLAB:
// Q = sum(power(P-repmat(Q, 1, size(P, 2)), 2), 1);
static void repmat_substract_power_sum(float Q[], const float P[]){
    // First row of Repeat -> Substract ->Power^2 -> Sum
    float q = *Q; // First column and first row value
    for(uint16_t j = 0; j < Pcolumns; j++){
        *Q = *P - q; // Substract
        *Q = *Q * *Q; // Power^2
        Q++;
        P++;
    }



    // The rest of the rows of Repeat -> Substract -> Power^2 -> Sum
    for(uint16_t i = 1; i < Prows; i++){
        q = *Q; // First column value at row i
        for(uint16_t j = 0; j < Pcolumns; j++){
            *Q = *P - q; // Substract
            Q[j] += *Q * *Q; //  Power^2 -> Sum to the top row at column index j
            Q++;
            P++;
        }
    }


}

int main()
{

    const float P[Prows*Pcolumns] = {-0.030123,  -0.163077,   0.218500,  -0.926896,  -0.159914,   2.344850,   0.473091,   0.039504,   0.590130,  -1.100642,
                                     -0.544295,   1.425373,  -0.337698,   1.440593,  -0.991939,  -0.457879,   0.136217,   0.173020,   0.947561,   0.596546,
                                     -0.145652,  -0.040126,  -0.835043,  -0.774521,  -0.333765,   1.586474, -1.811476,  -0.703679,  -1.382814,   0.406454};

    float Q[Prows*Pcolumns];
    Q[0] = 43;
    Q[Pcolumns*1] = -13;
    Q[Pcolumns*2] = 0.34;

    // Expected output on first row of Q: 2007.0   2071.3   1992.0   2139.3   2007.4   1811.7   1985.7   2020.2   1996.1   2129.7

    repmat_substract_power_sum(Q, P);


    for(int i = 0; i < Prows; i++){
        for(int j = 0; j < Pcolumns; j++){
            printf("%f\t", Q[Pcolumns*i + j]);
        }
        printf("\n");
    }

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