Вторник, 22.05.2012, 08:24
Приветствую Вас Гость

Сайт факультета ЭВТ ВолгГТУ

Меню сайта
Форма входа
Логин:
Пароль:

Войдите, чтобы не видеть рекламу
Категории раздела
Дополнительно
Реклама


Это интересно...

Декарт всегда говорил: "Я думаю, следовательно я существую".

Однажды в ресторане его спросили:
- Месье Декарт, вы закажете еще что-нибудь?

- Нет, не думаю, - ответил философ... и растворился...

Поиск
Наш опрос
Вы умеете программировать на
Всего ответов: 477
Статистика

Онлайн всего: 15
Ныкаются: 15
Пользователей: 0
Главная » Файлы » Выполненные работы » Язык Си (консольные) [ Добавить материал ]

Умножение матрицы на вектор последовательным алгоритмом с измерением времени выполнения (на языке C)

[ ] 10.07.2011, 14:52

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

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

Размер вектора и матрицы задаётся пользователем при запуске программы.

Код программы на языке C:

#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>

// Function that converts numbers form LongInt type to double type
double LiToDouble (LARGE_INTEGER x) {
    double result =
        ((double)x.HighPart) * 4.294967296E9 + (double)((x).LowPart);
    return result;
}

// Function that gets the timestamp in seconds
double GetTime() {
    LARGE_INTEGER lpFrequency, lpPerfomanceCount;
    QueryPerformanceFrequency (&lpFrequency);
    QueryPerformanceCounter (&lpPerfomanceCount);
    return LiToDouble(lpPerfomanceCount)/LiToDouble(lpFrequency);
}

// Function for simple definition of matrix and vector elements
void DummyDataInitialization (int* pMatrix, int* 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;
    }
}



// Function for random definition of matrix and vector elements
void RandomDataInitialization(int* pMatrix, int* pVector, int Size) {
    int i, j; // Loop variables
    srand(unsigned(clock()));
    for (i=0; i<Size; i++) {
        pVector[i] = rand();
        for (j=0; j<Size; j++)
            pMatrix[i*Size+j] = rand();
    }
}


// Function for memory allocation and definition of object’s elements
void ProcessInitialization (int* &pMatrix, int* &pVector,
                            int* &pResult, int &Size) {
    // Size of initial matrix and vector definition
    do {
        printf("\nEnter size of the initial objects: ");
        scanf("%d", &Size);
        printf("\nChosen objects size = %d\n", Size);
        if (Size <= 0)
            printf("\nSize of objects must be greater than 0!\n");
    }

    while (Size <= 0);
    // Memory allocation
    pMatrix = new int [Size*Size];
    pVector = new int [Size];
    pResult = new int [Size];
   
    // Definition of matrix and vector elements
    DummyDataInitialization(pMatrix, pVector, Size);
}

// Function for formatted matrix output
void PrintMatrix (int* 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*RowCount+j]);
        printf("\n");
    }
}

// Function for formatted vector output
void PrintVector (int* pVector, int Size) {
    int i;
    for (i=0; i<Size; i++)
        printf("%7.4f ", pVector[i]);
}

// Function for matrix-vector multiplication
void ResultCalculation(int* pMatrix, int* pVector, int* pResult, int Size) {
    int i, j; // Loop variables
    for (i=0; i<Size; i++) {
        pResult[i] = 0;
        for (j=0; j<Size; j++)
            pResult[i] += pMatrix[i*Size+j]*pVector[j];
    }
}

// Function for computational process termination
void ProcessTermination(int* pMatrix,int* pVector,int* pResult) {
    delete [] pMatrix;
    delete [] pVector;
    delete [] pResult;
}

int main() {
    int* pMatrix; // The first argument - initial matrix
    int* pVector; // The second argument - initial vector
    int* pResult; // Result vector for matrix-vector multiplication
    int Size; // Sizes of initial matrix and vector
    double Start, Finish, Duration;
    printf("Serial matrix-vector multiplication program\n");
    // Memory allocation and definition of objects' elements
    ProcessInitialization(pMatrix, pVector, pResult, Size);
    // Matrix and vector output
    //printf ("Initial Matrix \n");
    //PrintMatrix(pMatrix, Size, Size);
    //printf("Initial Vector \n");
    //PrintVector(pVector, Size);

    // Matrix-vector multiplication
    Start = GetTime();
    ResultCalculation(pMatrix, pVector, pResult, Size);
    Finish = GetTime();
    Duration = Finish-Start;
    // Printing the result vector
    printf ("\n Result Vector: \n");
    //PrintVector(pResult, Size);
    // Printing the time spent by matrix-vector multiplication
    printf("\n Time of execution: %f\n", Duration);
    // Computational process termination
    ProcessTermination(pMatrix, pVector, pResult);
    return 0;
}

Похожие материалы
К сожалению, таких не нашлось

Категория: Язык Си (консольные) | Добавил: mauzer
Просмотров: 600 | Загрузок: 0 | Рейтинг: 0.0/0 |
Всего комментариев: 0

Имя *:
Email:
Код *:




Рейтинг@Mail.ru Создать сайт бесплатно