Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Найти произведение двух симметричных матриц А и В. 
:(
    Опции темы
Alexandrus
Дата 27.5.2013, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.5.2013

Репутация: нет
Всего: нет



Язык СИ.
Найти произведение двух симметричных матриц А и В. Матрицы хранятся в одномерных массивах, где построчно записаны элементы, стоящие не ниже главной диагонали.

В общем задали такую задачку, решил ее, но преподаватель сказал, что можно было сделать намного проще (и надо сделать). Помогите максимально упростить задачу. Заранее спасибо. 


Код

    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
     
    int pos(int s, int row, int col)
    {
        if (row > col) {
            int tmp = row;
            row = col;
            col = tmp;
        }
        return (col - row + (s + s - row + 1) * row / 2);
    }
     
    void
    print_matrix1(int *a, int n)
    {
        int i, j;
        for (i = 0; i < n; ++i) {
            for (j = 0; j < n; ++j) {
                printf("%d ", a[pos(n, i, j)]);
            }
            printf("\n");
       }
    }
    void
    print_matrix2(int *a, int n)
    {
        int i, j;
        for (i = 0; i < n; ++i) {
            for (j = 0; j < n; ++j) {
                printf("%d ", a[n * i + j]);
            }
            printf("\n");
        }
    }
    int main()
    { int count,i,k,j,n,*a,*b,**c;
     
            printf("vvedite razmer massivov\n");
        scanf("%d", &count);
            srand(time(NULL));
             a = (int *)malloc(count * sizeof(int));
        b = (int *)malloc(count * sizeof(int));
     c = (int **)malloc(count * sizeof(int*));
        n = (sqrt(8 * count + 1) - 1) / 2;
     
       
            for (i = 0; i <count; i++){
    a[i]=rand()%10; printf("%3d",a[i]); }
    printf("\n");
     
     
     for (i = 0; i <count; i++){
    b[i]=rand()%10; printf("%3d",b[i]); }
    printf("\n");   
           
            for (i = 0; i < n; ++i) {
            for (j = 0; j < n; ++j) {
                int tmp = 0;
                for (k = 0; k < n; ++k) {
                    tmp += a[pos(n, i, k)] * b[pos(n, k, j)];
                }
                c[n * i + j] = tmp;
            }
        }
        printf("A:\n");
        print_matrix1(a, n);
        printf("B:\n");
        print_matrix1(b, n);
        printf("C:\n");
        print_matrix2(c, n);
            free(a);
            free(b);
            free(c);
      getch();  return 0;
    } 

PM MAIL   Вверх
Фантом
Дата 27.5.2013, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



Разбейте каждую матрицу на сумму трех - с ненулевыми элементами на главной диагонали, с ненулевыми элементами выше главной диагонали и с ненулевыми элементами ниже главной диагонали (причем 3-я матрица по условию равна транспонированной 2-й). Затем аккуратно выпишите, что получится при подсчете такого произведения. Обнаружится, что результат можно представить в таком же виде, причем его части считаются проще, чем непосредственно "в лоб".
PM   Вверх
fish9370
Дата 28.5.2013, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



 smile  мне интересно, когда фантазия преподов наконец проснется, и они перестанут давать одни и те же задания каждый семместр..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0909 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.