Умножение матрицы на вектор

Умножение матрицы на вектор

int a, i, j, s, b, c;

….

for (i=0; i<m; i++)

{ s=0;

for (j=0; j<n; j++)

s=s+a*b;

c=s;

}

Удаление строки из матрицы

Требуется удалить строку с заданным номером k. Решение задачи аналогично удалению элемента из одномерного массива. Все строки, начиная с (k+1)-й, нужно переместить вверх. Число строк уменьшается на 1.

for (i=k; i<m; i++)

for (j=0; j<n; j++)

b=b;

Удаление столбца осуществляется аналогично.

Перестановка строк матрицы

1-й способ.

С использованием вспомогательной переменной P (того же типа, что и элементы массива) перестановка осуществляется во всех столбцах двух строк.

for ( k=0; k<n; k++)

{ P=A; A=A; A=P; }

2-й способ

С использованием вспомогательного массива, в который целиком пересылается одна из строк для временного хранения.

for ( k=0; k<n; k++)

c=a;

for ( k=0; k<n; k++)

a= a;

for ( k=0; k<n; k++)

a=c;

Примеры решения

1. Вычисление и вывод на экран таблицы умножения в форме матрицы Пифагора.

#include <stdio.h>

void main()

{ const int n=10;

int a, i, j;

clrscr();

for (i=1; i<n; i++)

{ for ( j=1; j<n; j++)

{ a=i*j;

printf («%5d», a );

}

printf («\n»);

}

getch();

}

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

2. Заполнение матрицы случайными числами в диапазоне от 0 до 99 и поиск в ней максимального значения.

#include <stdio.h>

#include <stdlib.h>

#define n 5

void main()

{

int a, i, j, imax, jmax;

clrscr();

randomize();

for (i=0; i<n; i++)

{ for ( j=0; j<n; j++)

{ a=rand() % 100;

printf (“%d\t”, a);

}

printf (“\n”);

}

imax=jmax=0; // начало поиска

for (i=0; i<n; i++)

for ( j=0; j<n; j++)

if (a>a)

{ imax=i; jmax=j; }

printf (“max=a=%d\n”, imax, jmax, a);

getch();

}

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

#include <stdio.h>

void main()

{ float m1, max, min, m2;

int maxi, mini, i, j;

puts(«Введите исходный массив: \n»);

for(i=0;i<5;i++)

for(j=0;j<4;j++)

scanf(«%f», &m1);

max=m1;

min=m1;

for(i=0;i<5;i++)

for(j=0;j<4;j++)

if(max<=m1)

{max=m1;

maxi=i;}

for(i=0;i<5;i++)

for(j=0;j<4;j++)

if(min>=m1)

{min=m1;

mini=i;}

for(j=0;j<4;j++)

m2=m1;

for(j=0;j<4;j++)

m1=m1;

for(j=0;j<4;j++)

m1=m2;

puts(«Массив после перестановки строк:\n»);

for(i=0;i<5;i++)

{for(j=0;j<4;j++)

printf(«%f «, m1);

printf(«\n»);}

}

Порядок выполнения работы

1. Изучить теоретические сведения.

2. Ответить на контрольные вопросы.

3. Выполнить задание.

Контрольные вопросы

1. Что такое двумерный массив?

2. Сколько индексов требуется для обращения к элементу двумерного массива и что определяет каждый из индексов?

3.Как хранятся в памяти ЭВМ двумерные массивы?

4.Какими способами может быть описан двумерный массив?

5.Как производится ввод элементов двумерного массива?

6.Как производится вывод элементов двумерного массива?

Задания для выполнения

Часть 1.

1. Ввести двумерный массив размером m на n. Вычислить среднее арифметическое значение элементов массива, имеющих четные отрицательные значения,или вывести сообщение об отсутствии в массиве таких значений.

2. Ввести двумерный массив размером m на n. Вычислить произведение и количество элементов, находящихся в интервале от AдоB,или вывести сообщение об отсутствии в массиве таких значений.

3. Ввести двумерный массив размером m на n. Вычислить среднее арифметическое значение элементов, являющихся нечётными числами, или вывести сообщение «Таких значений нет».

4. Ввести двумерный массив размером m на n. Вычислить произведение и количество элементов, кратных 3 и некратных 5, или вывести сообщение «Таких значений нет».

5. Ввести двумерный массив размером m на n. Найти и вывести те элементы, которые при делении на 7 дают остаток 2 или 5, или вывести сообщение «Таких значений нет».

6. Ввести двумерный массив размером m на n. Найти количество и сумму тех элементов, которые делятся на 5 и не делятся на 7, или вывести сообщение «Таких значений нет».

7. Ввести двумерный массив размером m на n. Вычислить произведение элементов, кратных заданному числу k(ввести с клавиатуры), или вывести сообщение «Таких значений нет».

8. Ввести двумерный массив размером m на n. Получить сумму и количество элементов, принадлежащих отрезку , или вывести сообщение «Таких значений нет».

9. Ввести двумерный массив размером m на n. Найти и вывести минимальное из А0, А2, А4, … и максимальное из А1, А3, А5, …

10. Ввести двумерный массив размером m на n.

Получить сумму тех членов массива, которые нечётны и положительны, или вывести сообщение «Таких значений нет».

11. Ввести двумерный массив размером m на n. Вычислить среднее арифметическое значение элементов, кратных сумме их индексов (i+j), или вывести сообщение «Таких значений нет».

12. Ввести двумерный массив размером m на n. Вывести те значения, которые заканчиваются заданной цифрой (ввести с клавиатуры), или вывести сообщение «Таких значений нет».

13. Ввести двумерный массив размером m на n. Найти сумму тех из них, которые являются квадратами некоторого заданного числа k, или вывести сообщение «Таких значений нет».

14. Ввести двумерный массив размером m на n и некоторое число P. Вывести номера тех элементов, модуль значений которых больше этого числа, или вывести сообщение «Таких значений нет».

15. Ввести двумерный массив размером m на n, в котором есть по крайней мере два отрицательных числа. Вычислить произведение и количество элементов, находящихся между первым и последним отрицательным значениями.

Часть 2.

Написать программу по обработке двумерного массива.

1. Определить количество строк, не содержащих ни одного нулевого элемента.

2. Определить количество столбцов, не содержащих ни одного нулевого элемента.

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

4. Определить произведение элементов в тех строках, которые не содержат отрицательных элементов.

5. Определить сумму элементов в тех столбцах, которые не содержат отрицательных элементов.

6. Определить сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент.

7. Найти сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент.

8. Найти сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент.

9. Найти сумму модулей элементов, расположенных ниже главной диагонали.

10. Найти сумму модулей элементов, расположенных выше главной диагонали.

11. Найти количество строк, среднее арифметическое элементов которых меньше введенной с клавиатуры величины.

12. Найти номер первой из строк, содержащих хотя бы один положительный элемент.

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

14. Найти номер первого из столбцов, не содержащих ни одного отрицательного элемента.

15. Найти номер первой из строк, не содержащих ни одного положительного элемента.

ЛАБОРАТОРНАЯ РАБОТА № 15

Дата добавления: 2016-10-27; просмотров: 446 | Нарушение авторских прав

Рекомендуемый контект:


Похожая информация:


Поиск на сайте:


Напомню, что в заголовке модуля vector.tpu стоят строки

UNIT vector;
TYPE RealPtr=^REAL;

Добавим в

INTERFACE

PROCEDURE MatrVect(pm,pv: RealPtr; n,m:WORD; pu:RealPtr);

Умножает матрицу M на вектор v. Результат помещает в вектор u.
pm – указатель на первый элемент матрицы M (первая строка, первый столбец),
pv – указатель на первый компонент вектора v,
n – количество строк матрицы M,
m – количество столбцов матрицы M,
pu – указатель на первый компонент вектора u.

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

Теперь, спланировав заголовок процедуры и написав документацию, перейдем к написанию самой процедуры. Будет приведено 5 вариантов ее текста, с постепенно нарастающей эффективностью. По большому счету, каждая следующая версия к тому же и проще предыдущей, по крайней мере, с точки зрения алгоритма. Как обычно и бывает, для того, чтобы придумать более простое решение, требуются большие мыслительные усилия.

Для отладки каждая из 5 процедур приводится с одной и той же отладочной программой. Исходные числовые данные содержатся в текстовом файле mv.dat и считыватся модулем ReadNum (см.). Кроме того, отладочная программа использует модули Dos и Crt. Если на вашем современном компьютере возникают проблемы с последним модулем, загляните сюда.

Отладочной программа также оценивает скорость выполнения процедуры. Для этого она работает с матрицей 100 x 100 и повторяет процедуру count раз. Подберите эту константу так, чтобы на вашем компьютере выполнение программы mv1.pas длилось не меньше минуты. Имейте только в виду, что при определении длительности промежутка времени компьютер дает ошибку, достигающую 0.05 – 0.06 сек.

Приступим, наконец, к написанию процедуры.

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

Файл (mv1.pas) можно взять здесь .

Заметим, что напрасно мы вычисляем (i-1)*m всякий раз при проходе внутреннего цикла, ведь это выражение не зависит от j. Поэтому эффективнее будет его вычислить один раз вне цикла по j и использовать готовое значение внутри цикла. Отсюда…

Введем дополнительно локальную переменную k: WORD; и используем ее для хранения значения (i-1)*m :

Файл (mv2.pas) можно взять здесь .

Изменение переменной k можно осуществить иначе, крошечку сэкономив на операции умножения:

Файл (mv3.pas) можно взять здесь.

Перейдем к реализации «первого подхода». Пусть теперь k будет указателем на начало строки матрицы. Во внутреннем цикле для прохода по строке матрицы будем использовать указатель km, а для прохода по вектору – указатель kv:

Файл (mv4.pas) можно взять здесь .

Теперь пропустим написанную процедуру через пошаговое выполнение в отладчике, наблюдая за значениями указателей k и km. И обнаружим, что присваивание km := k не изменяет значения указателя km, за исключением первого раза. Дело в том, что после того, как как указатель km стоял на последнем элементе строки матрицы, оператор Inc(km) переносит его как раз на начало следующей строки – вспомните расположение элементов матрицы в памяти! Таким образом, указатель k оказывается лишним, и мы удаляем его, не забыв об инициализации указателя km:

Файл (mv5.pas) можно взять здесь .

Вот теперь можно выбрать наилучший вариант процедуры и, вырезав ее из отладочного файла, перенести в модуль vector.tpu.

Добавить комментарий

Закрыть меню