Invest-currency.ru

Как обезопасить себя в кризис?
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Умножение матриц паскаль

Умножение матриц паскаль

Мне нужно написать программу на Паскале: Найти произведение матрицы (5*4) на вектор (4*1) для любых заданных вещественных компонентов матрицы и вектора.

Мучилась над ней долго, пока не осознала, что просто не знаю, как рабатать с массивами.
А времени осталось совсем чуть-чуть.
Помогите, пожалуйста, несчастной студентке!

Я бы рада! Просто не успею уже! Да и программирование что-то очень сложное оказалось
А вы можете мне помочь?

-Pawel-Я, кстати, тоже из Пензы))

neshta
Хоть русский язык и не является моим самым сильным местом, но слово «двумерный» пишется без буквы «х». У нас в университете так пишут только студенты конкурирующей с нашей специальности

Natisha
Малое количество времени — плохая отговорка. Как вам уже было написано выше, найдите любую книжку — там должен быть пример перемножения матриц. Ваша задача: разобраться как это работает (в пошаговом режиме, с просмотром значений переменных), а потом подумать, что нужно исправить, чтобы размерность матриц можно было менять.

столько пустой болтовни — как в литературном кружке блин. лучше один раз показать!
объявляем 3 матрицы — 1,2 исходные, 3 — результат

Нда.
А рассказать девочке как данные забивать? а заодно и «выводим/сохраняем результат»?
а то ж она сразу скзала:
«Да и программирование что-то очень сложное оказалось»

так что все равно не успеет. потому как: «пока не осознала, что просто не знаю, как рабатать с массивами. «

перемножаем:
поэлементно умнождаем элементы столбца (матрица2) на элементы строки (матрица1) и суммируем результат (матрица3)
(обычный алгоритм перемножения матриц)

выводим — варианты:
на экран:
for y:=1 to 5 do
begin
for x:=1 to 1 do Write(‘Matrix3[‘,y,’,’,x,’] = ‘,Matrix3[y,x],’ ‘);
Writeln;
end;

Векторное произведение
Этот оператор применим только для двух вектор-столбцов, состоящих из трех элементов:

Векторное произведение имеет широкое применение в механике, гидродинамике, электромагнетизме и в других областях.
Обратная матрица
Обратная матрица определяется только для квадратных матриц: найти произведение матриц (https://algebra24.ru/umnozhenie-matric)

Произведение матрицы и ее обратной матрицы является единичной матрицей:

Произведение матрицы и единичной матрицы дает изначальную матрицу:

Определитель можно найти только для квадратной матрицы. Его значение может быть равно нулю, даже если все элементы матрицы не равны нулю. Обратная матрица содержит дроби, в знаменателе которых находится определитель:

Если определитель равен нулю, обратной матрицы не существует, а матрица является сингулярной. Вспомните деление на ноль в обычной алгебре. Mathcad сообщит, если матрица является сингулярной:

Для скаляра определитель равен его модулю:

Для вектора команда Определитель вычисляет длину вектора:

Умножение матриц паскаль

‘ width=’8′ height=’8’ /> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется .
2. Все тексты программ должны помещаться в теги [code=pas] . [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. «FAQ«, если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение — только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы — на PM!
6. Одна тема — один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме.
8. Спрашивайте и отвечайте четко и по существу.

Новичок

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация:

запутался в функции (и процедуре). Идея в том что бы умножить 1 строку и 1 столбец матриц , а потом создать цикл обхода по двум матрицам и использовать вспомогательную функцию.

Бывалый

Группа: Пользователи
Сообщений: 168
Пол: Мужской

Репутация: 3

Гуру

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Разработчик
Free Pascal: Разработчик

Репутация: 627

, тогда ты сам себя запутал:

Это все ни к чему. Квадратные матрицы могут быть перемножены только тогда, когда имеют одинаковый размер, поскольку для перемножения матриц нужно, чтоб количество столбцов первой равнялось количеству строк второй. Если будут квадратные матрицы разного размера — их произведения не существует.

Описывай нормально:
Ну, а сама процедура — вот так:

, хотя вот тут: Массивы. Матрицы. Типичные задачи. Олег выкладывал перемножение квадратных, а я — «сцепленных» матриц. Можно было бы и воспользоваться.

Добавлено через 1 мин.

Затем, чтобы потом одним движением перейти к работе с вещественной матрицей. Ага? Или с комплексной. Или с любой другой. Меняешь тип, и все, больше ничего менять не надо. В крайнем случае — перегрузить операторы сложения/умножения.

А я не понимаю, зачем
1) передавать в процедуру матрицы как Var-параметры, когда они не должны меняться. Специально, чтоб была возможность ошибиться и изменить значение? Не надо. Есть передача по значению, без Var. Если матрицы большие — то можно передать по константной ссылке : Procedure Mult(const A, B : TMatrix). В первом случае даже случайное изменение матрицы не передастся наружу. А во втором это вообще будет невозможно. Компилятор даст по рукам за каждую попытку присвоить какое-то значение константному параметру;

2) использовать глобальные переменные для возвращения результата. Что, очень нравится писать подпрограммы с побочными эффектами? Эта привычка может сослужить плохую службу. Чем меньше подпрограмма влияет на «внешнюю среду» — тем лучше. В идеале она должна общаться с «внешним миром» только через параметры;

3) переменные, описанные локально, описывать также и глобально. Все равно они не используются, преимущество среди всех одноименных переменных — у наиболее вложенной.

4) описывать переменные, которые тебе нужны потом, сразу в начале программы. Чем меньше времени живет переменная (и чем меньше других о ней знают) — тем лучше. Меньше соблазна где-нибудь случайно изменить значение и потом сидеть и искать ошибку. Описывай переменные КАК МОЖНО НИЖЕ по тексту.

Сообщение отредактировано: IUnknown — 7.06.2011 1:54

Двумерные массивы паскаль

Двумерный массив в Паскале представляет собой таблицу, состоящую из нескольких одномерных массивов. Двумерные массивы Pascal называют матрицей. Положение элементов в матрице обозначается двумя индексами.

Рассмотрим матрицу 3*3, то есть она будет состоять из 3 строк и 3 столбцов:

Читать еще:  Оператором языка программирования называется

Каждый элемент обладает 2-мя индексами. Первый — номер строки, в котором располагается элемент, а второй – номер столбца. Следовательно, индекс элемента определяется местом пересечением столбца и строки . Например, a13 – это элемент, стоящий в первой строке и в третьем столбце массива.

Описание двумерного массива Паскаля.

Имеется ряд методов объявления двумерного массива.

Рассмотри способ, в котором указывается тип элемента и переменные.

В данном варианте матрица mas состоит из 4 строк, в каждой из которых 9 столбцов. При этом мы можем обратиться к любой i -й строке через mas [ i ], а к j -му элементу внутри i строки – m [ i , j ].

Во втором и третьем способе матрицу можно задать в одну строку.

Как и в предыдущем варианте, матрица имеет 4 строки и 9 столбцов, обращение к какому-либо элементу массива имеет вид: mas [ i , j ]. Значит, что элемент, расположен в i -й строке и j -м столбце. Важно не перепутать строки со столбцами, иначе произойдет ошибка в ответе.

Основные действия с двумерными массивами Паскаля

Все основные действия над матрицами выполняются поэлементно, причем типы данных элементов должны быть одинаковыми. То есть, если матрица состоит из чисел, то действия можно выполнять только с числами. Однако для реализации операции присваивания массивам достаточно быть одного размера. Например, дан массив

в ходе выполнения такой программы матрице а можно присвоить значения матрицы b ( a := b ).

Ввод двумерного массива Паскаля.

Для поочередного ввода элементов в матрицу необходимо перебрать элементы с 1-го столбца 1-ой строки до последнего столбца последней строки. Для этого используется два оператора цикла for, причем один вложен в другой.

Проанализируем образец ввода двумерного массива Паскаля с клавиатуры:

Способ заполнения двумерного массива Паскаля зависит от поставленной задачи. Например, функцию random (N) позволяет заполнять матрицу случайными величинами a[i,j]:=random(25)-10. Некоторые задачи требуют содержание выражений в матрице. Не забывайте, что в любом случае должен быть определен каждый элемент в каждых строках и столбцах.

Вывод двумерного массива Паскаля на экран.

При выводе элементы должны печатать по порядку индексов, то есть в строках элементы стоят друг за другом, а в столбах один под другим. Для этого необходимо написать следующие элементы кода:

Примечание! Использовать операторы readln ( a [ i , j ]), writeln именно в таком виде, в противном случае компилятор не сможет считать и напечатать элемент. Ввод в программу операторов в таком виде readln (a), writeln (a) не допустим, так как а – это переменная типа массив.

Представление двумерного массива Паскаля в памяти

В памяти ЭВМ элементы двумерного массива располагаются последовательно и занимают несколько байт. Например, элементы массива типа integer, будут занимать по 2 байта. А весь массив займет S^2 байта, где S – количество элементов в массиве.

В матрице для каждого элемента типа integer потребуется 2 байта памяти. Рассмотрим пример.

В данном случае необходимо 24 байт памяти.

Модель размещения массива M типа matrix в памяти.

Для любого элемента предоставляется две ячейки памяти, размещение осуществляется от первой строки до нижней, в порядке изменения индекса.

Между переменной и адресом ячейки устанавливается соответствие, однако, при объявлении матрицы программе известно только адрес начала массива, к остальным элементам адрес вычисляется по формуле:

где Addres – местоположение первого элемента, выделенного для массива; I , J – индексы элемента в двумерном массиве; SizeElemt – размер элемента массива (например, 2 байта для элементов типа integer ); sum – количество элементов в строке.

SizeElemt * sum *( I -1)+ SizeElemt *( J -1) — смещение относительно начала массива.

Какой размер памяти выделяется для массива?

Чтобы программа работала нормально, компьютер выделят память сегментами по 64 Кбайт. Один из сегментов отводится для данных, которые обрабатываются программой. Для каждой переменной отводится свой сегмент. Например, если переменная состоит из массива, то он не сможет занимать места больше, чем 65536 байт. Естественно, кроме массива в сегменте могут находится и другие переменные, поэтому объем памяти вычисляется по формуле 65536- S , где S – размер памяти, ранее отведенные под другие переменные.

Рассмотрим пример, в котором:

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

Можно без труда подсчитать количество элементов, которые допустимы по формуле: 65536/2 –1=32767. Однако, других переменных не должно быть. Матрицы обладают еще меньшими пределами индексов.

Решим задачу с двумерным массивом Паскаля.

Задача: Вычислить произведение ненулевых элементов матрицы.

Решение:

  • Для начала нужно установить переменные: матрицу, состоящую из целочисленных элементов; P – произведение элементов, не равное 0; I , J – индексы массива; N , M – количество строк и столбцов в матрице.
  • Входные данные N , M пусть вводятся с клавиатуры, а матрица зададим с помощью функции random ().
  • Выходными параметром получим P (произведение).
  • Выведем матрицу на экран, для проверки работы программы.

А теперь поговорим о процедурах.

Примечание! Тип массива должен быть определен заранее. Например:

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

Print – процедуры вывода на экран матрицы, которая передается по значению.

Для реализации вложенных циклов внутри процедуры нужно ввести счетчики – k и h . Алгоритм вывода матрицы на экран был описан выше, используем это описанием.

Итак, опишем ход выполнения программы.

  • Ввод значений N и M ;
  • Обращаемся к процедурам vvod ( a ) и print ( a ) для ввода и вывода матрицы соответственно, где а – матрица;
  • Переменной, которая отвечает за произведение P, присвоим значение 1;
  • Поочередно перебираем элементы матрицы с индексом 11 до элемента с индексом Каждый элемент матрицы должен удовлетворять условию: если a ij ? 0, то произведение P умножаем на элемент a ij ( P = P * a ij );
  • Выводим на экран результат произведения ненулевых элементов матрицы – P

Обработка матриц в Паскале

Матрица — это двумерный массив , каждый элемент которого имеет два индекса: номер строки и номер столбца.

Объявить двумерный массив (матрицу) можно так:

имя : array [ индекс1_нач.. индекс1_кон, индекс2_нач.. индекс2_кон ]

  • тип определяет тип элементов массива,
  • имя — имя матрицы,
  • индекс1_нач..индекс1_кон — диапазон изменения номеров строк,
  • индекс2_нач..индекс2_кон — диапазон изменения номеров столбцов матрицы.
Читать еще:  Курсы программирования на языке паскаль

var h : array [ 0.. 1 1, 1.. 10 ] of integer;

Описана матрица целых чисел h , состоящая из двенадцати строк и десяти столбцов (строки нумеруются от 0 до 11, столбцы от 1 до 10).

Существует ещё один способ описать матрицы, для этого надо создать новый тип данных :

новый_тип=array [ индекс1_нач.. индекс1_кон ] of тип;

имя : array [ индекс2_нач.. индекс2_кон ] of новый_тип;

новый_тип=array [ список_диапазонов ] of тип;

В данном случае в матрицах a и b есть 10 строк и 30 столбцов, а с — матрица , в которой есть 16 строк и 14 столбцов.

Для обращения к элементу матрицы необходимо указать её имя и в квадратных скобках через запятую номер строки и номер столбца:

имя [ номер_строки, номер_столбца ]

имя [ номер_строки ] [ номер_столбца ]

Например, h[2,4] 1 Или h[2][4]. — элемент матрицы h , находящийся в строке под номером два и столбце под номером четыре.

Для обработки всех элементов матрицы необходимо использовать два цикла . Если матрица обрабатывается построчно, то во внешнем цикле последовательно перебираются строки от первой до последней, затем во внутреннем — все (первый, второй, третий и т. д.) элементы текущей строки. При обработке элементов матрицы по столбцам внешний цикл будет перебирать столбцы, внутренний — строки. На рис. 6.1 представлена блок-схема алгоритма обработки матрицы по строкам, на рис. 6.2 — по столбцам. Здесь i — номер строки, j — номер столбца, N — количество строк, M — количество столбцов матрицы A .

Рассмотрим основные операции , выполняемые над матрицами при решении задач.

6.1 Ввод-вывод матриц

Матрицы, как и массивы, нужно вводить (выводить) поэлементно. Вначале следует ввести размеры матрицы, а затем уже в двойном цикле вводить элементы. Блок-схема ввода элементов матрицы изображена на рис. 6.3.

Вывод можно осуществлять по строкам или по столбцам, но лучше, если элементы располагаются построчно, например,

Алгоритм построчного вывода элементов матрицы приведён на рис. 6.4.

Об описании матриц на языке Паскаль было рассказано в разделе 5.2 главы 5, обращение к элементу матрицы можно осуществить c помощью конструкции или .

Рассмотрим реализацию ввода-вывода матриц в консольных приложениях.

Для организации построчного ввода матрицы в двойном цикле по строкам и столбцам можно использовать оператор read .

В этом случае элементы каждой строки матрицы можно разделять символами пробела или табуляции, и только в конце строки нажимать Enter .

Ниже приведён пример консольного приложения ввода-вывода матрицы.

На рис. 6.5 представлены результаты работы программы.

Ввод матрицы также можно организовать с помощью следующего цикла .

Авторы предлагают читателю самостоятельно разобраться, в чём будет отличие ввода матрицы в этом случае.

Для ввода-вывода матриц можно использовать компонент типа TStringGrid, с которым мы познакомились в главе 5.

В качестве примера рассмотрим следующую задачу.

Блок-схема транспонирования матрицы приведена на рис. 6.6. При транспонировании матрицы получается матрица B.

Рассмотрим частный случай транспонирования матрицы фиксированного размера A(4,3) .

На форме разместим метки Label1 и Label2 со свойствами Caption — Заданная матрица и Транспонированная матрица , два компонента типа TStringGrid , изменив их свойства так, как показано в табл. 6.1, и кнопку Транспонирование матрицы.

Окно формы приложения представлено на рис. 6.7.

Ниже приведён текст подпрограммы с комментариями, которая будет выполняться, если пользователь щёлкнет по кнопке Транспонирование матрицы.

Умножение матриц паскаль

Многие задачи связаны с обработкой многомерных массивов данных. Наиболее распространены при этом двумерные массивы.

В математике двумерные массивы представляются матрицей:

или, в сокращенной записи,

,

где n — число строк матрицы, m — число столбцов, i , j — индексы (номера) текущих строки и столбца, на пересечении которых находится элемент .

Как и другие объекты данных, матрица описывается в разделе var . От вектора ее описание отличается тем, что в квадратных скобках перечисляются два оператора диапазона, указывающие, соответственно, нумерацию строк и столбцов матрицы:

var ИмяМатрицы : array

[n1..n2, m1..m2] of Тип ;

Здесь n 1.. n 2 — диапазон значений номера строки, n 1 и n 2 — целочисленные константы, m1..m2 — диапазон значений номера столбца, значения m1 и m2 также целочисленные.

Как и векторы, матрицы могут быть образованы из элементов любого существующего в языке типа данных.

Под матрицу из n строк и m столбцов выделяется область памяти размером n * m * k байт, где k — размер в байтах одного элемента. Для известных нам типов данных этот размер можно узнать из табл. 2.1. В оперативной памяти матрица хранится всегда построчно.

Например, для матрицы A , описанной оператором вида

var A:array [1..5,1..4] of real;

выделяется 20 ячеек памяти по 6 байт, причем в следующей за элементом A 1,4 ячейке хранится значение элемента A 2,1 .

Обращение к отдельным элементам матрицы осуществляется с помощью переменной с двумя индексами, например:

Первый индекс, как и в математике, всегда показывает номер строки, а второй — номер столбца.

Поскольку адресация памяти в любом случае линейна, следует понимать матрицу как удобный для программиста структурный тип данных. В отдельных случаях использование матрицы может быть заменено использованием вектора с тем же количеством элементов: так, матрице An , m всегда может быть сопоставлен вектор b из n * m элементов, а обращение к элементу A[i,j] при нумерации строк и столбцов с единицы может быть заменено на обращение к элементу b[(i-1)*m+j] .

Подобно тому, как любая последовательная обработка вектора выполняется в цикле for , обработка матрицы осуществляется в двойном цикле for :

for i :=1 to n do

for j :=1 to m do

Согласно правилу выполнения кратных циклов, переменная j меняется в этом двойном цикле быстрее, чем i , таким образом, обработка всех элементов матрицы будет выполнена построчно. Для последовательной обработки всех элементов матрицы по столбцам достаточно поменять местами циклы по i и j :

for j :=1 to m do

for i :=1 to n do

Теоретически мы могли бы решить эту же задачу и перестановкой индексов в обращении к элементу матрицы (использовать запись A[j,i] вместо A[i,j] ), однако, во избежание путаницы, делать этого не рекомендуется.

Приведем примеры использования двойного цикла for для ввода и вывода элементов матрицы. Пусть матрица c размерностью 4 3 2 (как мы помним, это означает, что в матрице 4 строки и 2 столбца) описана оператором вида

var c:array [1..4,1..2] of real;

В программе предусмотрено также 2 целочисленных счетчика для строк и столбцов матрицы:

В этом случае типовой ввод матрицы с клавиатуры мог бы выглядеть так:

Читать еще:  Двоичный язык программирования

writeln (‘Введите матрицу c ‘,

for i :=1 to 4 do

for j :=1 to 2 do read ( c [ i , j ]);

Иногда удобнее печатать отдельное приглашение к вводу каждого элемента:

writeln (‘Введите матрицу c[4,2]’);

for j:=1 to 2 do begin

Например, в качестве приглашения к вводу элемента c 1,1 на экране будет напечатано:

Оператор readln используется, поскольку элементы вводятся по одному.

Как и для векторов, возможны альтернативные способы ввода — описание матрицы в разделе констант и формирование ее элементов из случайных чисел. Приведем пример описания матрицы констант размерностью 2 3 3:

const d:array [1..2,1..3] of integer=(

Как видно из примера, для описания матрицы констант создается список ее строк, каждая строка, в свою очередь, представляет собой список значений элементов.

Вывод на экран матрицы небольшой размерности бывает удобно реализовать в виде «одна строка матрицы на одной строке экрана». Для этого элементы матрицы во внутреннем цикле печатаются оператором write , не переводящим строку на экране, а во внешнем цикле выполняется writeln :

writeln (‘ Матрица c:’);

for i:=1 to 4 do begin

for j:=1 to 2 do write (c[i,j]:4:1);

Разумеется, при выводе элементов матрицы можно использовать константы ширины и точности.

Базовые алгоритмы обработки матриц — те же, что мы изучили в гл. 11-15. Отличие состоит в том, что реализацию этих алгоритмов можно условно рассматривать для двух типов задач:

· алгоритмы реализуются при обработке всех элементов матрицы;

· алгоритмы реализуются при обработке отдельных строк или столбцов матрицы.

В первом случае типовая учебная задача на матрицу отличается от аналогичной задачи с вектором лишь тем, что используются двойные циклы ввода, обработки и вывода.

1. Приведем пример реализации алгоритма первого типа.

В матрице A размерностью 4*4 найти сумму ее положительных элементов, произведение элементов, значения которых попадают в интервал [2, 10], а также отношение этих двух величин.

var a:array [1..4,1..4] of real;

writeln (‘Ввод матрицы размерностью 4*4’);

for i :=1 to 4 do

for j :=1 to 4 do read ( a [ i , j ]);

for j:=1 to 4 do begin

if a[i,j]>0 then s:=s+a[i,j];

if (a[i,j]>=2) and (a[i,j] 0 then begin

writeln (‘ Отношение =’,z:6:2);

else writeln (‘p=0, отношение ‘,

reset (input); readln;

Поскольку о типе матрицы в условии задачи ничего не сказано, выбран «более общий» тип real . Способ ввода также выбран «по умолчанию» — пользователь вводит значения элементов матрицы с клавиатуры. Искомые сумма, произведение и отношение обозначены, соответственно, s , p и z .

2. Рассмотрим пример реализации алгоритма второго типа. Отличие его в том, что алгоритм подсчета или поиска каждый раз заново реализуется во внутреннем цикле, таким образом, искомая в двойном цикле величина заново получает значение на каждом шаге внешнего цикла.

Задана матрица C размерностью 3 3 4. Найти номер строки, сумма элементов которой максимальна.

На этот раз заполним матрицу случайными числами. Обозначим s сумму элементов очередной строки, max — максимальную из этих сумм. В качестве искомого номера строки введем целочисленную переменную imax , в которую будем заносить номер текущей строки i , если для этой строки выполняется соотношение s>max . Переменную s следует инициализировать на каждом шаге внешнего цикла по i (ведь сумма элементов ищется заново в каждой строке), тогда как переменная max ищется для всей матрицы и инициализируется один раз до двойного цикла:

var c:array [1..3,1..4] of real;

write (‘ Матрица C’);

for i:=1 to 3 do begin

for j:=1 to 4 do begin

for i:=1 to 3 do begin

for j:=1 to 4 do s:=s+c[i,j];

if s>max then begin

writeln (‘ Номер строки =’,imax);

Аналогично могут быть реализованы типовые алгоритмы в столбце матрицы — как описано выше, для этого достаточно поменять местами циклы по i и j .

3. Встречаются также задачи, где результаты обработки строк или столбцов матрицы должны быть занесены в вектор. Решим задачу подобного типа.

В матрице S размерностью 20 3 4 приведены оценки 20 студентов за 4 экзамена последней сессии. Подчитать и вывести на экран элементы вектора, содержащего средние баллы каждого студента.

Обозначим искомый вектор как B . Его размерность очевидна, поскольку каждый элемент вектора зависит от одной строки матрицы. Применив алгоритм обработки строк матрицы, получаем следующую программу:

var s : array [1..20,1..4] of integer ;

b:array [1..20] of real;

for i:=1 to 20 do

for j:=1 to 4 do s[i,j]:=3+random(3);

формируя вектор B>

for i:=1 to 20 do begin

for j:=1 to 4 do b[i]:=b[i]+s[i,j];

write (‘ Оценки ‘:8,’ Баллы ‘);

for i:=1 to 20 do begin

for j:=1 to 4 do write (s[i,j]:2);

4. Нередко встречаются задачи, требующие обработки элементов, расположенных под или над главной диагональю матрицы. Главная диагональ характеризуется тем, что номера строк и столбцов расположенных на ней элементов совпадают. Корректно это понятие определено только для квадратных матриц с одинаковым числом строк и столбцов. Соответственно, для обработки элементов, лежащих на главной диагонали матрицы A размерностью n 3 n было бы достаточно цикла

for i:=1 to n do begin

Когда требуется обработать элементы, лежащие под главной диагональю (для них номер строки больше номера столбца), двойной цикл обработки мог бы выглядеть так:

for j:=1 to n do begin

if i>j then begin

Приведенный код имеет тот недостаток, что в нем выполняются заведомо лишние шаги цикла. Действительно, для квадратной матрицы размерностью n 3 n мы выполняем n 2 шагов двойного цикла, тогда как имеется всего элементов под главной диагональю. Исправить ситуацию может двойной цикл с переменной границей, подобный изученному выше:

for j:=1 to i-1 do begin

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

for i :=1 to n do

for j := i +1 to n do begin

5. Распространенный класс задач, связанных с умножением и обращением матриц, мы рассмотрим в гл. 18. Сейчас же ограничимся реализацией хорошо известного алгоритма умножения матрицы A размерностью n 3 m на вектор b размерности m . Напомним, что в результате умножения получается вектор размерности n (обозначим его c ), а само умножение состоит в том, что каждая строка матрицы скалярно умножается на вектор по формуле и результат заносится в компоненту ci . Применив известные нам типовые алгоритмы, напишем следующую программу:

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector