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

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Реализация последовательного алгоритма

2024-02-15 57
Реализация последовательного алгоритма 0.00 из 5.00 0 оценок
Заказать работу

Вверх
Содержание
Поиск

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

Рассмотрим переменные, которые используются в основной функции (main) нашего приложения.

Первые две из них (pMatrix и pVector) – это, соответственно, матрица и вектор, которые участвуют в матрично-векторном умножении в качестве аргументов. Третья переменная pResult – вектор, который должен быть получен в результате матрично-векторного умножения. Переменная Size определяет размер матриц и векторов (предполагаем, что матрица pMatrix квадратная, имеет размерность Size.Size, и умножается на вектор из Size элементов). Далее объявлены переменные циклов.

double* pMatrix; // Initial matrix

double* pVector; // Initial vector

double* pResult; // Result vector for matrix-vector multiplication

int Size; // Sizes of initial matrix and vector

Для хранения матрицы pMatrix используется одномерный массив, в котором матрица хранится построчно. Таким образом, элемент, расположенный на пересечении i-ой строки и j-ого столбца матрицы, в одномерном массиве имеет индекс i*Size+j.

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

printf ("Serial matrix-vector multiplication program\n");

getch();

Ввод размеров объектов

Для задания исходных данных последовательного алгоритма умножения матрицы на вектор реализуем функцию ProcessInitialization. Эта функция предназначена для определения размеров матрицы и вектора, выделения памяти для всех объектов, участвующих в умножении (исходных матрицы pMatrix и вектора pVector, и результата умножения pResult), а также для задания значений элементов исходных матрицы и вектора. Значит, функция должна иметь следующий интерфейс:

// Function for memory allocation and data initialization

void ProcessInitialization (double* &pMatrix, double* &pVector, double* &pResult, int &Size);

На самом первом этапе необходимо определить размеры объектов (задать значение переменной Size). В тело функции ProcessInitialization добавьте выделенный фрагмент кода:

// Function for memory allocation and data initialization

void ProcessInitialization (double* &pMatrix, double* &pVector, double* &pResult, int &Size)

{

// Setting the size of initial matrix and vector

printf("\nEnter size of the initial objects: ");

scanf("%d", &Size);

printf("\nChosen objects size = %d", Size);

Пользователю предоставляется возможность ввести размер объектов (матрицы и вектора), который затем считывается из стандартного потока ввода stdin и сохраняется в целочисленной переменной Size.

Далее печатается значение переменной Size (рис. 1.4).

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

void main()

{

double* pMatrix; // Initial matrix

double* pVector; // Initial vector

double* pResult; // Result vector for matrix-vector multiplication

int Size; // Sizes of initial matrix and vector

time_t start, finish;

double duration;

printf ("Serial matrix-vector multiplication program\n");

ProcessInitialization(pMatrix, pVector, pResult, Size);

getch();

}

Скомпилируйте и запустите приложение. Убедитесь в том, что значение переменной Size задается корректно.

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

// Setting the size of initial matrix and vector

do

{

printf("\nEnter size of the initial objects: ");

scanf("%d", &Size);

printf("\nChosen objects size = %d", Size);

if (Size <= 0)

printf("\nSize of objects must be greater than 0!\n");

}

while (Size <= 0);

Запустите приложение. Попытайтесь ввести неположительное число в качестве размера объектов. Убедитесь в том, что ошибочные ситуации обрабатываются корректно.

Ввод данных

Функция инициализации процесса вычислений должна осуществлять также выделение памяти для хранения объектов (добавьте выделенный код в тело функции ProcessInitialization):

// Function for memory allocation and data initialization

void ProcessInitialization (double*&pMatrix,double*&pVector, double*&pResult,int Size)

{

// Setting the size of initial matrix and vector

do

{

<…>

}

while (Size <= 0);

// Memory allocation

pMatrix = new double [Size*Size];

pVector = new double [Size];

pResult = new double [Size];

}

Далее необходимо задать значения всех элементов матрицы pMatrix и вектора pVector. Для выполнения этих действий реализуем еще одну функцию DummyDataInitialization. Интерфейс и реализация этой функции представлены ниже:

// Function for simple initialization of matrix and vector elements

void DummyDataInitialization(double*pMatrix,double*pVector,int Size) {

int i, j; // Loop variables

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

{

pVector[i] = 1;

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

pMatrix[i*Size+j] = i;

}

}

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

 

*(задание данных при помощи датчика случайных чисел будет рассмотрено в далее).

Вызов функции DummyDataInitialization необходимо выполнить после выделения памяти внутри функции ProcessInitialization:

// Function for memory allocation and data initialization

void ProcessInitialization(double*&pMatrix,double*&pVector,

double*&pResult,int Size)

{

// Setting the size of initial matrix and vector

do

{

<…>

}

while (Size <= 0);

// Memory allocation

<…>

// Initialization of matrix and vector elements

DummyDataInitialization(pMatrix, pVector, Size);

}

Реализуем еще две функции, которые помогут контролировать ввод данных. Это функции форматированного вывода объектов: PrintMatrix и PrintVector. В качестве аргументов в функцию форматированной печати матрицы PrintMatrix передается указатель на одномерный массив, где эта матрица хранится построчно, а также размеры матрицы по вертикали (количество строк RowCount) и горизонтали (количество столбцов ColCount). Для форматированной печати вектора при помощи функции PrintVector, необходимо сообщить функции указатель на вектор, а также количество элементов в нем.

// Function for formatted matrix output

void PrintMatrix (double* pMatrix, int RowCount, int ColCount) {

int i, j; // Loop variables

for (i=0; i<RowCount; i++) {

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

printf("%7.4f ", pMatrix[i*ColCount+j]);

printf("\n");

}

}

// Function for formatted vector output

void PrintVector (double* pVector, int Size) {

int i;

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

printf("%7.4f ", pVector[i]);

printf("\n");

}

Добавим вызов этих функций в основную функцию приложения:

// Memory allocation and data initialization

ProcessInitialization(pMatrix, pVector, pResult, Size);

// Matrix and vector output

printf ("Initial Matrix: \n");

PrintMatrix (pMatrix, Size, Size);

printf (“Initial Vector: \n”);

PrintVector (pVector, Size);

Скомпилируйте и запустите приложение. Убедитесь в том, что ввод данных происходит по описанным правилам (рис. 1.5). Выполните несколько запусков приложения, задавайте различные размеры объектов.


Поделиться с друзьями:

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

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

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

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.022 с.