Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...
Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
Топ:
Основы обеспечения единства измерений: Обеспечение единства измерений - деятельность метрологических служб, направленная на достижение...
Когда производится ограждение поезда, остановившегося на перегоне: Во всех случаях немедленно должно быть ограждено место препятствия для движения поездов на смежном пути двухпутного...
Генеалогическое древо Султанов Османской империи: Османские правители, вначале, будучи еще бейлербеями Анатолии, женились на дочерях византийских императоров...
Интересное:
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Искусственное повышение поверхности территории: Варианты искусственного повышения поверхности территории необходимо выбирать на основе анализа следующих характеристик защищаемой территории...
Уполаживание и террасирование склонов: Если глубина оврага более 5 м необходимо устройство берм. Варианты использования оврагов для градостроительных целей...
Дисциплины:
2024-02-15 | 57 |
5.00
из
|
Заказать работу |
Содержание книги
Поиск на нашем сайте
|
|
При выполнении этого задания необходимо реализовать последовательный алгоритм матрично-векторного умножения. В ходе выполнения задания необходимо дополнить программу операциями ввода размера объектов, инициализации матрицы и вектора, умножения матрицы на вектор и вывода результатов.
Рассмотрим переменные, которые используются в основной функции (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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!