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

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

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

2024-02-15 17
Реализация последовательного алгоритма 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). Выполните несколько запусков приложения, задавайте различные размеры объектов.


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

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

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...



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

0.019 с.