2014-12-15 4 views
-3

Я хотел бы умножить 2 матрицы с помощью указателей в c. Трудность в том, что я должен использоватьgcc -Werror -o run filename file.c в терминале linux, поэтому я не могу иметь даже предупреждения в своем коде.умножение матрицы в c с помощью указателей

У меня есть MyArray матрица пхп (где п четное число - 4,6,8 ...), и я должен разделить его на 4 части, после этого, я должен умножить эту часть как:

1x2 = a, ax3 = b и bx4 = c (где 1,2,3,4 - это 4 части моей исходной матрицы).

Проблема довольно проста, но я не могу ее обработать. Код:

#include <stdio.h> 
#include <stdlib.h> 
#include <malloc.h> 
//---------------------------------------------initialize and adding elements!!! 
void init_matrix(int **myArray, int n) 
{ 
    int i,j; 
    printf("Insert data:\n"); 
    for (i = 0; i < n; i++) 
     for (j = 0; j < n; j++) 
     { 
      scanf("%d", &*(*(myArray+i)+j)); 
     } 

    printf("The introduced Array:\n"); 
    for (i = 0; i < n; i++) 
    { 
     for (j = 0; j < n; j++) 
      printf("%d ", *(*(myArray+i)+j)); 
      printf("\n"); 
     } 
     printf("\n"); 
     { 
    } 

} 

//---------------------------------------------devisation in 4 parts!!! 
void first_matrix(int **myArray,int n) 
{ int i,j,m; 

    printf("\nThe first matrix is: \n"); 

     for (i = 0; i < n/2; i++) 
    { 
     for (j = 0; j < m/2; j++) 
      printf("%d ", *(*(myArray+i)+j)); 
        printf("\n"); 
     } 
     printf("\n"); 
     { 
    } 
} 

void second_matrix(int **myArray, int n) 
{ int i,j,m; 

    printf("\nThe second matrix is: \n"); 

     for (i = 0; i < n/2; i++) 
    { 
     for (j = m/2; j < m; j++) 
      printf("%d ", *(*(myArray+i)+j)); 
      printf("\n"); 
     } 
     printf("\n"); 
     { 
    } 
} 

void third_matrix(int **myArray, int n) 
{ int i,j,m; 

    printf("\nThe third matrix is: \n"); 

     for (i = n/2; i < n; i++) 
    { 
     for (j = 0; j < m/2; j++) 
      printf("%d ", *(*(myArray+i)+j)); 
      printf("\n"); 
     } 
     printf("\n"); 
     { 
    } 
} 

void fourth_matrix(int **myArray, int n) 
{ int i,j,m; 

    printf("\nThe fourth matrix is: \n"); 

     for (i = n/2; i < n; i++) 
    { 
     for (j = m/2; j < m; j++) 
      printf("%d ", *(*(myArray+i)+j)); 
      printf("\n"); 
     } 
     printf("\n"); 
     { 
    } 
} 

int main(void)//----------------------------------------------------main function!!! 
{ 
    int **myArray,i, n; 

     printf("Enter the dimmension of Array: "); 
     scanf("%d", &n); 

    //alloc memory 
    myArray = (int **) malloc(n * sizeof(int*)); 
    for(i = 0; i< n; i++) 
    myArray[i] = (int *) malloc(sizeof(int)); 


    init_matrix(myArray,n); 
    first_matrix(myArray,n); 
    second_matrix(myArray,n); 
    third_matrix(myArray,n); 
    fourth_matrix(myArray,n); 

    //some methods for mutiply 

    //free memory 
    for(i = 0; i< n; i++) 
    free(myArray[i]); 
    free(myArray); 

    printf("\n"); 
    return 0; 
} 
+0

Пожалуйста, отформатируйте свой код последовательно, это важно для восприятия структуры. Как и выше, это едва читаемо. –

+0

В вашем коде не существует C++ - это вопрос C, да? – Cameron

+0

Что/где «myArray1»? – chux

ответ

1

Хитрая то, что я должен использовать GCC -Werror -o запустить имя файла file.c в Linux терминала, так что я не могу иметь даже предупреждения в своем коде

Для начала все вашего кода должны компилироваться без предупреждений. Предупреждения - это способ, которым компилятор говорит «Ваш код может не работать предсказуемым образом или, как вы думаете, до тех пор, пока вы не исправите это». Компилятор редко ошибается.

Далее, общее умножение матрицы с помощью указателей просто требует, чтобы вы соблюдали правила умножения матриц. Это означает, что вы можете умножить матрицу m x n (matrix_a) на матрицу n x p (matrix_b) с результатом, имеющим размеры m x p (product matrix). См. Matrix Multiplication.

Вам необходимо будет выделить место для хранения product matrix. Самый простой способ - объявить функцию умножения, которая возвращает указатель на тип, необходимый для матрицы продукта. Вам необходимо будет пройти matrix_a, matrix_b вместе с dimensions for each, чтобы выделить, вычислить и вернуть product. Ниже приведен один подход к этой реализации.

Примечание: поскольку вы занимаете место для product matrix, вы также несете ответственность за его освобождение. Также примечание, желательно инициализировать product matrix до 0. Выбор calloc для распределения строк может автоматизировать это для вас, не требуя явного обнуления. (проверка ошибок ниже показана, но не реализована)

/* 
    if mtrx_a is (m x n) and mtrx_b is (n x p), 
    the product is an (m x p) matrix 
*/ 
int **mtrx_mult (int m, int n, int p, int **mtrx_a, int **mtrx_b) 
{ 
    int **result = malloc (m * sizeof (*result)); 
    // if (!result) throw error 

    register int i=0, j=0, k=0; 
    for (i = 0; i < m; i++) 
    { 
     /* calloc initializes all to '0' */ 
     result[i] = calloc (p, sizeof (**result)); 
     // if (!result[i]) throw error 
    } 

    for (i = 0; i < m; i++) 
    { 
     for (j = 0; j < p; j++) 
     { 
      for (k = 0; k < n; k++) 
      { 
       result [i][j] += mtrx_a [i][k] * mtrx_b [k][j]; 
      } 
     } 
    } 

    return result; 
} 
+0

Да, но как я должен отнести четверть моей основной матрицы к mtrx_a, например? – Choletski

+0

При работе с субматрицами вы либо кодируете логику, чтобы перебирать только нужные элементы (например, настроить i, j, k), либо можете объявить дополнительный массив указателей и сопоставить необходимые элементы с новым массивом указателей. (вам не нужно выделять дополнительное хранилище и копировать исходные элементы, если вы не планируете изменять значения). Затем вы можете перебирать свои значения в новом подматрице напрямую. –

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