Форум программистов, компьютерный форум CyberForum.ru

Перемножение двух квадратных целочисленных матриц - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 162, средняя оценка - 4.73
TrAgiD
Сообщений: n/a
27.03.2011, 21:45     Перемножение двух квадратных целочисленных матриц #1
Помогите написать прогу:
Написать подпрограмму
void mult(int a[], int b[], int c[], int N);

для перемножения двух квадратных целочисленных матриц (c = a × b) размером N × N (где N порядка 100) с помощью указателей и адресной арифметики.

Использовать в подпрограмме квадратные скобки [] запрещено!

Оптимизировать код программы путём «чистки циклов».

Память для каждой матрицы m[N][N] выделяется в едином блоке (т.е. для всей матрицы сразу, а не для каждого ряда по отдельности), в котором ряды матрицы прилегают друг к другу (т.е. первый элемент очередного ряда следует без промежутка за последним элементом предыдущего ряда), см. схему расположения ячеек многомерного массива в памяти:m[0][0] … m[0][N-1] m[1][0] … m[1][N-1] … … … m[N-1][0] … m[N-1][N-1]

заранее спасибо...

ПС. есть пример программы, которая перемножает массивы используя квадратные скобки...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
 
using namespace std;
 
const int M = 3, N = 8, MN = M * N;
 
void genereeri(int* m)
{
    for(int k = 0; k < MN; k++)
        m[k] = (rand() % 201) - 100; // -100 .. 100
}
 
void mult_classic(int a[M][N], int b[N][M], int c[M][M])
{
    for(int i = 0; i < M; i++) // i = ряд матрицы a
    {
        for(int j = 0; j < M; j++) // j = столбец матрицы b
        {
            int skalaar = 0;
            for(int k = 0; k < N; k++)
                skalaar += a[i][k] * b[k][j];
 
            c[i][j] = skalaar;
        }
    }
}
 
void print(int m[], int elemente, int veerge, string nimetus)
{
    cout << "\n*** " << nimetus << " ***";
    for(int i = 0; i < elemente; i++)
    {
        if(i % veerge == 0)
            cout << endl;
        cout << m[i] << '\t';
    }
    cout << endl;
}
 
int main()
{
    int x[M][N], y[N][M], z[M][M];
 
    srand(time(NULL)); // Randomize
    genereeri(&x[0][0]);
    genereeri(&y[0][0]);
 
    clock_t algus = clock();
    mult_classic(x, y, z);
    cout << float(clock() - algus) / CLOCKS_PER_SEC << " sekundit\n";
 
    print(&x[0][0], M * N, N, "x");
    print(&y[0][0], N * M, M, "y");
    print(&z[0][0], M * M, M, "z");
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
14004 / 8835 / 1234
Регистрация: 24.12.2010
Сообщений: 16,014
28.03.2011, 13:07     Перемножение двух квадратных целочисленных матриц #2
Как-то так
C
1
2
3
4
5
for(ii=0; ii<N; ii++) for(jj=0; jj<N; jj++) {
   x = 0;
   for(i=0;i<N; i++) x+= *(a+ii*N +i) * *(b+i*N + jj);
   *(c+ii*N+jj) = x;
}
Добавлено через 2 минуты
Дело в том, что
C
1
c[ii][jj] = *(C+ii*N+jj);
Возможны описки. Проверь повнимательней
TrAgiD
Сообщений: n/a
28.03.2011, 14:22     Перемножение двух квадратных целочисленных матриц #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот вроде исправил код, но пишет ошибку типо Invalid type arguement of 'unary *' в 25ой и 27ой строках. Не подскажите в чем проблема?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
 
 
using namespace std;
 
const int M = 3, N = 8, MN = M * N;
 
void genereeri(int* m)
{
    for(int k = 0; k < MN; k++)
        m[k] = (rand() % 201) - 100; // -100 .. 100
}
 
void mult_classic(int a, int b, int c)
{
    for(int i = 0; i < M; i++) // i = ряд матрицы a
    {
        for(int j = 0; j < M; j++) // j = столбец матрицы b
        {
            int skalaar = 0;
            for(int k = 0; k < N; k++)
                skalaar += *(a+i*a+k) * *(b+j*b+k);
 
            *(c+i*c+j) = skalaar;
        }
    }
}
 
void print(int m[], int elemente, int veerge, string nimetus)
{
    cout << "\n*** " << nimetus << " ***";
    for(int i = 0; i < elemente; i++)
    {
        if(i % veerge == 0)
            cout << endl;
        cout << m[i] << '\t';
    }
    cout << endl;
}
 
int main()
{
    int x[M][N], y[N][M], z[M][M];
 
    srand(time(NULL)); // Randomize
    genereeri(&x[0][0]);
    genereeri(&y[0][0]);
 
    clock_t algus = clock();
    mult_classic(x, y, z);
    cout << float(clock() - algus) / CLOCKS_PER_SEC << " sekundit\n";
 
    print(&x[0][0], M * N, N, "x");
    print(&y[0][0], N * M, M, "y");
    print(&z[0][0], M * M, M, "z");
}
Байт
 Аватар для Байт
14004 / 8835 / 1234
Регистрация: 24.12.2010
Сообщений: 16,014
28.03.2011, 15:19     Перемножение двух квадратных целочисленных матриц #4
C
1
mult_classic(int *a, int *b, int *c)
Но вообще, в коде такой раскардаш, что править его надо с начала до конца.
Ты сперва определись, в каком виде представляются матрицы. По заданию int a[M*M], т.е. в виде линейного массива.
Yandex
Объявления
28.03.2011, 15:19     Перемножение двух квадратных целочисленных матриц
Ответ Создать тему
Опции темы

Текущее время: 09:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru