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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 162, средняя оценка - 4.73
TrAgiD
Сообщений: n/a
#1

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

27.03.2011, 21:45. Просмотров 20189. Ответов 3
Метки нет (Все метки)

Помогите написать прогу:
Написать подпрограмму
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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2011, 21:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перемножение двух квадратных целочисленных матриц (C++):

Перемножение квадратных матриц с вещественными числами - C++
Что-то никак не могу найти ошибку: #define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; ...

Из двух квадратных матриц создать третью, перемножив элементы первых двух согласно условию - C++
Для двух квадратных матриц нужно создать третюю матрицу, элементы которой которой должны равняться произведению элементов соответствующей...

Перемножение двух матриц - C++
int Multiplication(int a, int b) { cout &lt;&lt; &quot;***********Result***********&quot; &lt;&lt; endl; int c; for(int i = 0; i &lt; 5; i++) // i...

Перемножение двух матриц - C++
Приет.Ребята подскажите как перемножить две матрицы разных размеров используя динамический массив Вот код который получился у меня: ...

Перемножение двух матриц - C++
Yo. У меня проблема с перемножением. Код конечно же написал, но вот в чем проблема. Когда я ввожу элементы матрицы В ( а это 2 матрица), но...

Перемножение двух матриц - C++
Написать программу перемножения двух матриц. Использовать динамические массивы. Вот код, но это при условии, что N у всех трех матриц...

3
Байт
Эксперт C
16320 / 10596 / 1586
Регистрация: 24.12.2010
Сообщений: 20,206
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);
Возможны описки. Проверь повнимательней
0
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");
}
Байт
Эксперт C
16320 / 10596 / 1586
Регистрация: 24.12.2010
Сообщений: 20,206
28.03.2011, 15:19 #4
C
1
mult_classic(int *a, int *b, int *c)
Но вообще, в коде такой раскардаш, что править его надо с начала до конца.
Ты сперва определись, в каком виде представляются матрицы. По заданию int a[M*M], т.е. в виде линейного массива.
0
28.03.2011, 15:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2011, 15:19
Привет! Вот еще темы с ответами:

Перемножение двух матриц - C++
Собственно задачка: Написать программу перемножения двух матриц. Найти вид функции сложности алгоритма. 2 пункт не обязателен, а...

Перемножение двух матриц. В ответе большие отрицательные числа - C++
Код написан верно, но при расчете выдает странный результат. Вместо правильных ответов, он прибавляет их к числу -858993460. Чем это...

Найти суму двух квадратных матриц разного размера - C++
Найти суму двух квадратных матриц разного размера.

Поменять местами элементы заданных секторов двух квадратных матриц - C++
В двух квадратных матрицах выделено четыре сектора, ограниченных диагоналями: верхний, нижний, правый и левый. Поменять местами элементы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru