Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/23: Рейтинг темы: голосов - 23, средняя оценка - 5.00
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 60

Перемножение транспонированных матриц

16.05.2012, 15:06. Показов 4431. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Заданы две матрицы B(4,4) и D(3,3). Написать программу транспонирования каждой из заданных матриц с последующим перемножением транспортированной матрицы на соотвествующую ей исходную. Матрицы задать с листа эксель (без использования рандомайза и инпут бокс).
Visual Basic
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
Sub макрос()
Dim B(4, 4) As Integer 'матрица A
Dim BB(16) As Integer 'матрица А разложенная в одномерный массив
Dim BT(4, 4) As Integer 'транспонированная матрица A
Dim D(3, 3) As Integer
Dim DD(9) As Integer
Dim DT(3, 3) As Integer
Dim BBT(4, 4) As Integer 'матрица - произведение матрицы В на транспонированную матрицу В
Dim DDT(3, 3) As Integer
Dim z As Integer 'переменная для заполнения одномерного массива
 
'задание матриц
Randomize
For i = 1 To 4
 For j = 1 To 4
 B(i, j) = ((Rnd * 10) + 1)
 Cells(i, j) = B(i, j)
 Next j
Next i
 
Randomize
For i = 1 To 3
 For j = 1 To 3
 D(i, j) = ((Rnd * 10) + 1)
 Cells(i, j + 5) = D(i, j)
 Next j
Next i
 
 
'транспонирование B
 
z = 0
For i = 1 To 4
For j = 1 To 4
BB(z) = B(i, j)
Index = Index + 1
Next j
Next i
 
z = 0
For i = 1 To 4
For j = 1 To 4
BT(j, i) = BB(z)
z = z + 1
Next j
Next i
Cells(i + 6, j) = BT(j - 1, i - 1)
 
 
'транспонирование D
 
z = 0
For i = 1 To 3
For j = 1 To 3
DD(z) = D(i, j)
z = z + 1
Next j
Next i
 
z = 0
For i = 1 To 3
For j = 1 To 3
DT(j, i) = DD(z)
z = z + 1
Next j
Next i
 
Cells(i + 6, j + 5) = DT(j - 1, i - 1)
 
'умножение матриц
For i = 1 To 4
 For j = 1 To 4
 For k = 1 To 4
 BBT(i, j) = BBT(i, j) + B(i, k) * BT(k, j)
 Next k
 Next j
Next i
Cells(i + 10, j) = BBT(i - 1, j - 1)
 
For i = 1 To 3
 For j = 1 To 3
 For k = 1 To 3
 DDT(i, j) = DDT(i, j) + D(i, k) * DT(k, j)
 Next k
 Next j
Next i
Cells(i + 10, j) = DDT(i - 1, j - 1)
 
End Sub

Вот вроде сделано, но как задать именно с листа экселя не могу понять? Без рандомайза макрос перестаёт работать.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.05.2012, 15:06
Ответы с готовыми решениями:

Перемножение транспонированных матриц (исправить ошибку)
Заданы две матрицы B(4,4) и D(3,3). Написать программу транспонирования каждой из заданных матриц с последующим перемножением...

Перемножение матриц
Доброго времени суток! На листе 2 массива. Размерность массивов может быть разная, но количество строк в одном массиве равно количеству...

Перемножение матриц и векторов
Само задание такое: Заданы две матрицы А(4, 4) и B(3, 3) и два вектора C(4) и D(3). Написать программу вычисления произведений матриц на...

16
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
16.05.2012, 15:51
вместо
Visual Basic
1
2
3
4
5
6
7
Randomize
For i = 1 To 4
 For j = 1 To 4
 B(i, j) = ((Rnd * 10) + 1)
 Cells(i, j) = B(i, j)
 Next j
Next i
пишем:
Visual Basic
1
2
3
4
5
For i = 1 To 4
 For j = 1 To 4
 B(i, j) = Cells(i, j)
 Next j
Next i
соответственно, диапазон A1:D4 на активном листе должен быть заполнен, причем целыми числами.

для второй матрицы - аналогично.
1
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 60
16.05.2012, 16:34  [ТС]
А как для второй матрицы задать диапазон? Она же находится в диапазоне F1:H1

Добавлено через 2 минуты
Пишу
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
For i = 5 To 8
     For j = 5 To 8
         d(i, j) = Cells(i, j)
 Next j
Next i
 
For i = 5 To 8
     For j = 5 To 8
         dt(j, i) = d(i, j)
     Next j
     
Next i 'выводим результат транспонирования в виде массива
    For i = 5 To 8
    For j = 5 To 8
        Cells(i + 10, j + 5) = dt(i, j)
 Next j
Next i
 
End Sub
Но выдаются только нули на листе
0
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
16.05.2012, 16:36
Visual Basic
1
2
3
4
5
For i = 1 To 3
 For j = 1 To 3
 D(i, j) = Cells(i, j + 5)
 Next j
Next i
вторая матрица находится в диапазоне F1:H3
1
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 60
16.05.2012, 16:45  [ТС]
Сделал транспонирование двух матриц и вывод их на тот же лист
Visual Basic
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
Sub макрос()
Dim B(4, 4) As Integer 'матрица A
Dim BT(4, 4) As Integer 'транспонированная матрица A
Dim d(9, 9) As Integer
Dim dt(9, 9) As Integer
Dim BBT(4, 4) As Integer 'матрица - произведение матрицы В на транспонированную матрицу В
Dim DDT(3, 3) As Integer
Dim z As Integer 'переменная для заполнения одномерного массива
Dim matr()
Dim mas()
 
Call FromRangeToMatrMN(matr, M, N)
'задание матриц
For i = 1 To 4
    For j = 1 To 4
     B(i, j) = Cells(i, j)
 Next j
Next i
'транспонирование B
For i = 1 To 4
     For j = 1 To 4
         BT(j, i) = B(i, j)
     Next j
     Next i
     'выводим результат транспонирования в виде массива
    For i = 1 To 4
    For j = 1 To 4
        Cells(i + 5, j) = BT(i, j)
Next j
Next i
Call FromRangeToMatrMN(mas, ka, Na)
For i = 1 To 3
 For j = 1 To 3
 d(i, j) = Cells(i, j + 5)
 Next j
Next i
For i = 1 To 3
     For j = 1 To 3
         dt(j, i) = d(i, j)
     Next j
   
Next i 'выводим результат транспонирования в виде массива
    For i = 1 To 3
    For j = 1 To 3
        Cells(i + 5, j + 5) = dt(i, j)
 Next j
Next i
 
 
End Sub
Теперь проблема в самом понимании того, как сделать перемножение матриц - ведь если делать по цифре, задавая умножение каждой ячейки на другую - то это будет огромная функция. Существуют ли другие способы?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
16.05.2012, 17:03
Почему Вы не пользуетесь введением данных в массив напрямую с листа без обхода каждой ячейки:
(так гораздо быстрее)

Visual Basic
1
2
3
4
5
matr=selection 'или
matr=[A1:H1]
matr=application.transpose([A1:H1])
'транспонирование из одного массива в другой
matr2=application.transpose(matr)
Произведение Вам нужно в виде одного числа или в виде новой матрицы?
2
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
16.05.2012, 17:06
Цитата Сообщение от Diskretor Посмотреть сообщение
Произведение Вам нужно в виде одного числа или в виде новой матрицы?
Diskretor, а это как?
вроде бы в матричной арифметике перемножение квадратных матриц одного размера должно давать квадратную матрицу такого же размера?
0
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 60
16.05.2012, 17:07  [ТС]
В задании не указано - я думаю, что нужно ввиде новой матрицы. Ведь произведение матрицы на матрицу равно матрице - насколько я помню вышмат
0
16.05.2012, 17:55

Не по теме:

Простите, я не знаком с матричной арифметикой, зато знаю команды которые суммируют и перемножают все элементы матрицы. Но это не в тему

Visual Basic
1
2
ArSum = Application.Sum(Ar) 
ArProduct = Application.Product(Ar)

0
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
16.05.2012, 19:15
в действительности, весь макрос умещается в две строки:
Visual Basic
1
2
3
4
5
6
Sub test()
  With WorksheetFunction
    [a6:d9] = .MMult([a1:d4], .Transpose([a1:d4]))
    [f6:h8] = .MMult([f1:h3], .Transpose([f1:h3]))
  End With
End Sub
но, боюсь, для лабы это не прокатит?

на всякий случай: как умножать матрицы
Вложения
Тип файла: xls умножение матриц.xls (23.5 Кб, 32 просмотров)
2
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 60
16.05.2012, 19:25  [ТС]
да, такое не прокатит - нужно через обычные функции

Добавлено через 9 минут
Visual Basic
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
Function Umn()
 Dim B(1 To 4, 1 To 4) As Integer
 Dim BT(1 To 4, 1 To 4) As Integer
 Dim D(1 To 3, 1 To 3) As Integer
 Dim DD(9) As Integer
 Dim DT(1 To 3, 1 To 3) As Integer
 Dim BBT(1 To 4, 1 To 4) As Integer
 Dim DDT(1 To 3, 1 To 3) As Integer
 
 For i = 1 To 4
 For j = 1 To 4
 For k = 1 To 4
 BBT(i, j) = BBT(i, j) + B(i, k) * BT(k, j)
 Next k
 Next j
 Next i
 
 For i = 1 To 4
 For j = 1 To 4
 Cells(i + 20, j) = BBT(i, j)
 Next j
 Next i
 
 For i = 1 To 3
 For j = 1 To 3
 For k = 1 To 3
 DDT(i, j) = DDT(i, j) + D(i, k) * DT(k, j)
 Next k
 Next j
 Next i
 
 
 For i = 1 To 3
 For j = 1 To 3
 Cells(i + 20, j + 5) = DDT(i, j)
 Next j
 Next i
 
 End Function
Вот вроде перемножение, но почему-то оно у меня всегда уходит в нули
0
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
16.05.2012, 19:36
это весь код? который на 39 строк?
в нем ведь вообще нет загрузки исходных матриц и транспонирования.
а произведение матриц с нулевыми элементами даст матрицу с нулевыми элементами.

или это просто для сокращения объема поста на форуме?
0
4 / 4 / 0
Регистрация: 10.03.2012
Сообщений: 60
16.05.2012, 19:39  [ТС]
Цитата Сообщение от ikki_cf Посмотреть сообщение
это весь код? который на 39 строк?
в нем ведь вообще нет загрузки исходных матриц и транспонирования.
а произведение матриц с нулевыми элементами даст матрицу с нулевыми элементами.

или это просто для сокращения объема поста на форуме?
Всё, разобрался - вот полный код, который у меня получился, вроде правильно:
Visual Basic
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
Sub макрос()
Dim B(1 To 4, 1 To 4) As Integer
 Dim BT(1 To 4, 1 To 4) As Integer
 Dim D(1 To 9, 1 To 9) As Integer
 
 Dim DT(1 To 9, 1 To 9) As Integer
 Dim BBT(1 To 4, 1 To 4) As Integer
 Dim DDT(1 To 3, 1 To 3) As Integer
Dim z As Integer 'переменная для заполнения одномерного массива
Dim matr()
Dim mas()
 
Call FromRangeToMatrMN(matr, m, n)
'задание матриц
For i = 1 To 4
    For j = 1 To 4
     B(i, j) = Cells(i, j)
 Next j
Next i
'транспонирование B
For i = 1 To 4
     For j = 1 To 4
       
     Next j
     Next i
     'выводим результат транспонирования в виде массива
    For i = 1 To 4
    For j = 1 To 4
        Cells(i + 5, j) = BT(i, j)
Next j
Next i
Call FromRangeToMatrMN(mas, ka, Na)
For i = 1 To 3
 For j = 1 To 3
 D(i, j) = Cells(i, j + 5)
 Next j
Next i
For i = 1 To 3
     For j = 1 To 3
         DT(j, i) = D(i, j)
     Next j
   
Next i 'выводим результат транспонирования в виде массива
    
    For j = 1 To 3
        Cells(i + 5, j + 5) = DT(i, j)
 Next j
Next i
 
 
 For i = 1 To 4
 For j = 1 To 4
 For k = 1 To 4
 BBT(i, j) = BBT(i, j) + B(i, k) * BT(k, j)
 Next k
 Next j
 Next i
 
 For i = 1 To 4
 For j = 1 To 4
 Cells(i + 20, j) = BBT(i, j)
 Next j
 Next i
 
 For i = 1 To 3
 For j = 1 To 3
 For k = 1 To 3
 DDT(i, j) = DDT(i, j) + D(i, k) * DT(k, j)
 Next k
 Next j
 Next i
 
 
 For i = 1 To 3
 For j = 1 To 3
 Cells(i + 20, j + 5) = DDT(i, j)
 Next j
 Next i
 
End Sub

Благодарю всех за помощь.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
16.05.2012, 20:13
Meigas, в коде Next i без For, затем двойной цикл, в котором нет команд, подпрограмма FromRangeToMatrMN - которой нет вообще.

ikki_cf, благодарю за попытку, но я из Вики ничего не понял. Если есть более простое объяснение, пожалуйста, в личку.
0
Fuzzov
18.05.2013, 16:16
Dragokas, если не сложно исправь ошибку в коде, а то никак не получается)
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
18.05.2013, 16:41
Но матрицы все-равно нужны... Может просто вписать проверку? Что-то типа:
if cells(1,1).value = vbNullString Then - первый генератор
if cells(1,6).value = vbNullString - второй генератор
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
18.05.2013, 17:58
Meigas, я бы рад, но я не изучал матричную арифметику.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.05.2013, 17:58
Помогаю со студенческими работами здесь

Перемножение и вычитание матриц
Добрый вечер, уважаемые! Честно скажу, что ни капли не разбираюсь в VBA, но срочно нужно написать программу, знаю, что она по сути...

Некорректно работает перемножение матриц
Здравствуйте. Задача: произвести действия над матрицами. Проблема в том, что до операции умножения всё считает правильно, а на умножении...

Транспонирование и перемножение матриц VBA
Добрый вечер!!! Интересует вопрос транспонирования и перемножения матриц встроенными функциями Excel(VBA), такими как MINVERSE и MMULT, без...

VBA: Перемножение двоичных матриц
Прошу помочь, в выполнении этого задания. Написать процедуру перемножения матрицы A(5,10) на матрицу В(10,4). Данные нужно взять из...

Транспонирование матриц и перемножение транспонированной на исходную
Задание: Заданы две матрицы В(4,4) и D(3,3). Написать программу транспонирования каждой из заданных матриц с последующим перемножением...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru