Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
 Аватар для lup
0 / 0 / 0
Регистрация: 09.06.2009
Сообщений: 18

Умножить одну матрицу на вторую - оптимизация циклов

09.06.2009, 03:15. Показов 3166. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, как можно строки 56-74 записать одним циклом? Если быть более точным, то умножить одну матрицу на вторую.

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include<stdio.h>
#include<conio.h>
main()
{
clrscr();
FILE *A, *B, *C;
int i,j;
int a[5][5], b[5][5], c[5][5], aT[5][5], aTb[5][5];
 
A=fopen("A.TXT", "r");
for(i=1; i<=4; i++)
  {
   for(j=1; j<=4; j++)
   fscanf(A, "%d ", &a[i][j]);
  }
fclose(A);
 
B=fopen("B.TXT", "r");
for(i=1; i<=4; i++)
  {
   for(j=1; j<=4; j++)
   fscanf(B, "%d ", &b[i][j]);
  }
fclose(B);
 
printf("Matrycja A ");
for(i=1; i<=4; i++)
  {
   printf("\n");
   for(j=1; j<=4; j++)
     printf("%d ", a[i][j]);
  }
 
printf("\n\nMatrycja B ");
for(i=1; i<=4; i++)
  {
   printf("\n");
   for(j=1; j<=4; j++)
     printf("%d ", b[i][j]);
  }
 
for(i=1; i<=4; i++)
  {
   for(j=1; j<=4; j++)
   aT[j][i]=a[i][j];
  }
 
printf("\n\nMatrycja AT ");
for(i=1; i<=4; i++)
  {
   printf("\n");
   for(j=1; j<=4; j++)
     printf("%d ", aT[i][j]);
  }
 
aTb[1][1]=aT[1][1]*b[1][1]+aT[1][2]*b[2][1]+aT[1][3]*b[3][1]+aT[1][4]*b[4][1];
aTb[1][2]=aT[1][1]*b[1][2]+aT[1][2]*b[2][2]+aT[1][3]*b[3][2]+aT[1][4]*b[4][2];
aTb[1][3]=aT[1][1]*b[1][3]+aT[1][2]*b[2][3]+aT[1][3]*b[3][3]+aT[1][4]*b[4][3];
aTb[1][4]=aT[1][1]*b[1][4]+aT[1][2]*b[2][4]+aT[1][3]*b[3][4]+aT[1][4]*b[4][4];
 
aTb[2][1]=aT[2][1]*b[1][1]+aT[2][2]*b[2][1]+aT[2][3]*b[3][1]+aT[2][4]*b[4][1];
aTb[2][2]=aT[2][1]*b[1][2]+aT[2][2]*b[2][2]+aT[2][3]*b[3][2]+aT[2][4]*b[4][2];
aTb[2][3]=aT[2][1]*b[1][3]+aT[2][2]*b[2][3]+aT[2][3]*b[3][3]+aT[2][4]*b[4][3];
aTb[2][4]=aT[2][1]*b[1][3]+aT[2][2]*b[2][3]+aT[2][3]*b[3][3]+aT[2][4]*b[4][3];
 
aTb[3][1]=aT[3][1]*b[1][1]+aT[3][2]*b[2][1]+aT[3][3]*b[3][1]+aT[3][4]*b[4][1];
aTb[3][2]=aT[3][1]*b[1][2]+aT[3][2]*b[2][2]+aT[3][3]*b[3][2]+aT[3][4]*b[4][2];
aTb[3][3]=aT[3][1]*b[1][3]+aT[3][2]*b[2][3]+aT[3][3]*b[3][3]+aT[3][4]*b[4][3];
aTb[3][4]=aT[3][1]*b[1][3]+aT[3][2]*b[2][3]+aT[3][3]*b[3][3]+aT[3][4]*b[4][3];
 
aTb[4][1]=aT[4][1]*b[1][1]+aT[4][2]*b[2][1]+aT[4][3]*b[3][1]+aT[4][4]*b[4][1];
aTb[4][2]=aT[4][1]*b[1][2]+aT[4][2]*b[2][2]+aT[4][3]*b[3][2]+aT[4][4]*b[4][2];
aTb[4][3]=aT[4][1]*b[1][3]+aT[4][2]*b[2][3]+aT[4][3]*b[3][3]+aT[4][4]*b[4][3];
aTb[4][4]=aT[4][1]*b[1][3]+aT[4][2]*b[2][3]+aT[4][3]*b[3][3]+aT[4][4]*b[4][3];
 
printf("\n\nMatrycja AT*B");
for(i=1; i<=4; i++)
  {
   printf("\n");
   for(j=1; j<=4; j++)
     printf("%d ", aTb[i][j]);
  }
 
for(i=1; i<=4; i++)
  {
   for(j=1; j<=4; j++)
   c[i][j]=3*(aTb[i][j]-b[i][j])-b[i][j];
  }
 
printf("\n\nObchysljujemo matrycju C=3(ATB-B)-B");
printf("\nMatrycja C dorivnjuje:\n");
for(i=1; i<=4; i++)
  {
   printf("\n");
   for(j=1; j<=4; j++)
     printf("%d ", c[i][j]);
  }
printf("\n\nVykonala studentka grupy KNz11 Dyka Oksana");
 
C=fopen("c.txt","w");
for(i=1; i<=4; i++)
  {
   for(j=1; j<=4; j++)
     fprintf(C, "%d ", c[i][j]);
   fprintf(C, "\n");
  }
return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.06.2009, 03:15
Ответы с готовыми решениями:

Умножить первую матрицу на вторую
2 матрицы считываются с файла и выводятся, а вот умножение их почему то не работает, помогите #include &quot;stdafx.h&quot; #include...

Как в SQL запрос вставить вторую переменную? Одну получается, а вторую нет
Вместо переменной s% ввожу марку провода А-, АС-, АСИ-... и т.д. После дефиса у них число, равное диаметру сечения 25, 35, 50... и т.д. Я...

как умножить матрицу столбец на матрицу строку MathCAD
как умножить матрицу столбец на матрицу строку и додати (+) их элементы если можно то пример

36
 Аватар для lup
0 / 0 / 0
Регистрация: 09.06.2009
Сообщений: 18
09.06.2009, 20:10  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от FunDuck Посмотреть сообщение
Еще вот так можно:
C++
1
2
3
4
5
6
7
8
9
for (int i = 0; i < N; i++){
        for (int j = 0; j < N; j++){
            tmp = 0;
            for (int x = 0; x < N; x++){
                tmp += arr1[j][x]*arr2[x][j];
            }
            arr3[i][j] = tmp;
        }
    }
Программы видоизменять уже не буду, но для общего сведения также благодарю. Попробую разобраться.

Добавлено через 2 минуты 8 секунд
Цитата Сообщение от Search.. Посмотреть сообщение

Не по теме:

Ну... Как пожелаешь :D

Не по теме:

Если судьба каким-то образом в Харьков выбросит - буду помнить. X)

0
692 / 383 / 51
Регистрация: 22.01.2009
Сообщений: 1,135
09.06.2009, 20:11
Пардон.. очепятался... там вот так будет:
C++
1
tmp += arr1[i][x]*arr2[x][j];
вместо
C++
1
tmp += arr1[j][x]*arr2[x][j];
2
 Аватар для lup
0 / 0 / 0
Регистрация: 09.06.2009
Сообщений: 18
09.06.2009, 20:28  [ТС]
Цитата Сообщение от FunDuck Посмотреть сообщение
Пардон.. очепятался... там вот так будет:
C++
1
tmp += arr1[i][x]*arr2[x][j];
вместо
C++
1
tmp += arr1[j][x]*arr2[x][j];
Скажите, а по логике этот код должен умножать матрицы любой размерности (то есть не только 4х4) или я не правильно понимаю?

Добавлено через 9 минут 38 секунд
У меня ещё один вопрос возник, если можете подскажите пожалуйста.
Когда я работаю в компиляторе, то программа правильно считывает данные с txt-файлов. А вот когда уже перехожу к готовому exe-файлу - то в упор ничего с них не считывается, причём файлы местонахождения своего не меняли, не помогает даже если указываю полный путь к файлу. В чём может быть проблема? И сразу прошу прощения, если вопрос слишком глупый.
0
692 / 383 / 51
Регистрация: 22.01.2009
Сообщений: 1,135
09.06.2009, 20:46
Ну по идее - должен...(я про код).. а что касается файлов... если запускать программу в визуальной среде, то файл (если путь относительный) должен находиться в папке с проектом, а просто при запуске программы файл должен лежать в папке с программой.
0
 Аватар для lup
0 / 0 / 0
Регистрация: 09.06.2009
Сообщений: 18
09.06.2009, 20:52  [ТС]
Цитата Сообщение от FunDuck Посмотреть сообщение
Ну по идее - должен...(я про код)..
Тогда ещё больше благодарю.
Цитата Сообщение от FunDuck Посмотреть сообщение
а что касается файлов... если запускать программу в визуальной среде, то файл (если путь относительный) должен находиться в папке с проектом, а просто при запуске программы файл должен лежать в папке с программой.
Так оно всё так и находится! Что в первом, что в втором случаи. И реестр, так же одинаковый. Только всё равно почему-то не считывает...
Может быть при написании у меня возникла какая-то ошибка? Речь идёт об вышесказанной программе.
0
692 / 383 / 51
Регистрация: 22.01.2009
Сообщений: 1,135
09.06.2009, 21:04
Ошибок каcающихся работы с файлами вроде не видно... можно фалйы на диск C:\ (например) положить... и пользовать абсолютные пути... т.е. вместо A.TXT будет C:\\A.TXT ,.... но проверь что при запуске exe файл в этой же папке лежит, а не в папке с исходниками и файлами проекта.
0
 Аватар для lup
0 / 0 / 0
Регистрация: 09.06.2009
Сообщений: 18
09.06.2009, 21:08  [ТС]
Цитата Сообщение от FunDuck Посмотреть сообщение
Ошибок каcающихся работы с файлами вроде не видно... можно фалйы на диск C:\ (например) положить... и пользовать абсолютные пути... т.е. вместо A.TXT будет C:\\A.TXT ,.... но проверь что при запуске exe файл в этой же папке лежит, а не в папке с исходниками и файлами проекта.
Так я уже также вчера пробовала... ничего.
0
692 / 383 / 51
Регистрация: 22.01.2009
Сообщений: 1,135
09.06.2009, 21:14
Всмысле абсолютный путь?
0
 Аватар для lup
0 / 0 / 0
Регистрация: 09.06.2009
Сообщений: 18
09.06.2009, 21:18  [ТС]
Да, в коде задавала абсолютный путь: C:\\A.TXT, C:\\B.TXT и C:\\С.TXT.
На С переместила txt-файлы и сам exe-файл, но ничего не помогло.
0
Заказ софта
 Аватар для Search..
343 / 188 / 21
Регистрация: 26.05.2009
Сообщений: 863
09.06.2009, 21:29
Ужас..
0
692 / 383 / 51
Регистрация: 22.01.2009
Сообщений: 1,135
09.06.2009, 21:31
Ну тогда не знаю в чем проблема....
0
Заказ софта
 Аватар для Search..
343 / 188 / 21
Регистрация: 26.05.2009
Сообщений: 863
09.06.2009, 21:32
FunDuck: Ты должен знать ! Я в тебя верю
0
 Аватар для lup
0 / 0 / 0
Регистрация: 09.06.2009
Сообщений: 18
09.06.2009, 21:49  [ТС]
Каким-то левым боком, мне получилось эту хню запустить... работает на соплях, но работает!
Ещё осталось только преподавателя убедить что она работает. =)
Вопрос закрыт, ещё раз спасибо всем за помощь.)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.06.2009, 21:58
Цитата Сообщение от lup Посмотреть сообщение
Ещё осталось только преподавателя убедить что она работает. =)
Если не перепишешь цикл так, как предлагал FunDuck, то врядли убедишь
0
 Аватар для lup
0 / 0 / 0
Регистрация: 09.06.2009
Сообщений: 18
09.06.2009, 22:06  [ТС]
Убежду, причём просто. Ибо нам попался преподаватель, который сам ни черта в программировании не понимает. Мы его спрашивали, как он будет задания проверят (ибо явно видно, что на лекциях он только с листика списывает), он сказал, что если программка запуститься и будет выдавать результат, значит она работает. Собственно и все проблемы. Я могла бы и первоначальную версию сдать и он бы ничего не сказал, но всё-таки для себя хотелось большего знать.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.06.2009, 22:12
Цитата Сообщение от lup Посмотреть сообщение
он сказал, что если программка запуститься и будет выдавать результат, значит она работает.
Ну, есди есть уверенность, что он не захочет проверить матрицу 5 на 5, то, возможно, и прокатит
0
 Аватар для lup
0 / 0 / 0
Регистрация: 09.06.2009
Сообщений: 18
09.06.2009, 22:19  [ТС]
Есть, причём 100%. =)
А ещё не посмеет, ибо в задании чётко стоит условие 4х4.
Если что, явно есть на что спихнуть. >_>
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.06.2009, 22:19
Помогаю со студенческими работами здесь

Как 161 матрицу 3x3, умножить на матрицу 3x1
Здравствуйте! У меня есть матрица поворота 3x3 (1 миниатюра), с поворотом от 0 до 160 градусов (2 миниатюра). В итоге у меня 161 матриц...

Функция: первую половину массива умножить на 2, а вторую на 3
Помогите. Напишите функцию, которая принимает от пользователя массив и возвращает массив, первую половину которого умножает на 2, а...

Оптимизация циклов
я был очень удивлён, когда путём простой перемены мест внешнего цикла с внутренним проиводительность метода увеличилась на 20% :) ...

Построчно ввести матрицу целых чисел 5х5 (любые целые числа), вторую матрицу заполнить случайными числами
Построчно ввести матрицу целых чисел 5х5 (любые целые числа), вторую матрицу заполнить случайными числами &lt; 100 (матрица естественно...

Оптимизация 2х вложенных циклов
Доброго дня! Есть программа, рисующая притягивающиеся друг к другу шарики. В программе 2 потока: отрисовка и расчёт новых координат...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Гайд, как ворваться в вайб-кодинг в мае 2026
Noname2331 17.05.2026
Простите за получившееся полотно текста, я даже не знаю, как его разбить на главы. Тут, что называется, ни добавить ни убавить, одна сцена одним дублем. На моих глазах недавно случилось чудо. Как. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru