2013-11-25 3 views
0

Я хочу что-то вроде этого: Умножить матрицу 3x3 с матрицей 3x1. Я пытаюсь преобразовать свой 1-мерный массив в 2 измерения. И я думаю, что это нормально, но позже в умножении я получаю ошибки. Но я не знаю, почему. Вот мой код.Умножение матрицы C++ разных размеров

// 20 -20 0   150 
    //-20 40 -20 x  0 
    // 0 -20 30   400 
    int n = 3; 
double *tab_P = new double [n]; 

tab_P[0] = 150; 
tab_P[1] = 0; 
tab_P[2] = 400; 


double **tab_H; 
tab_H = new double* [n]; 
for(int i=0; i<n; i++) 
    tab_H[i] = new double[n]; 

tab_H[0][0] = 0.2; 
tab_H[0][1] = 0.15; 
tab_H[0][2] = 0.1; 


tab_H[1][0] = 0.15; 
tab_H[1][1] = 0.15; 
tab_H[1][2] = 0.1; 

tab_H[2][0] = 0.1; 
tab_H[2][1] = 0.1; 
tab_H[2][2] = 0.1; 

double **tmp_P; 
tmp_P = new double *[n]; 
for(int i=0; i<n; i++) 
    tmp_P[i] = new double [1]; 

for(int i=0; i<n; i++){ 
    for(int j=0; j<1; j++) { 
     tmp_P[i][j] = tab_P[i]; 
    } 
} 

double **result = new double * [n]; 
for(int i=0; i<n; i++) 
    result[i] = new double [1]; 


int i,j,k; 
int s = 0; 
for(i=0; i<n; i++) { 
    for(j=0; j<1; j++) { 
     s = 0; 
     for(k =0; k<n; k++) 
      s += tab_H[i][k] * tmp_P[k][j]; 
     result[i][j]; 
    } 
} 
+0

Где вы выделили память для * tab_P? И снова какая ошибка вы видите, результат умножения? Или 1D массив? – theAlias

+0

@theAlias ​​Он сделал это прямо вверху, это всего лишь одномерный массив. – cmaster

+0

Я получаю ошибку где-то в цикле в конце. Чтение местоположения нарушения прав доступа .... Я думаю, что что-то не так с индексами в цикле, но я не вижу, где. – Madbrush

ответ

0

код вы вывесили не содержит каких-либо ошибок памяти (я проверил это с Valgrind, который является чрезвычайно ценным инструментом, проверить его). Итак, почему-то вы не скопировали ошибку в код, который вы опубликовали. Вы должны найти свою ошибку, когда вы делаете символ по сравнению с тем, что вы разместили, и вашим исходным кодом.

У вашего кода есть логическая ошибка: вы используете int для переменной s, которую вы используете для суммирования промежуточных продуктов. Всякий раз, когда вы назначаете значение s, продукт с плавающей запятой округляется до целого числа. Это приведет к некорректному результату. Используйте переменную double для переменной s.

Смежные вопросы