Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Листинг 7. Перемножение матриц с применением неровных массивов





 

using System;

using System. Diagnostics;

using PerfCounter;

 

namespace BenchJaggedMatrix

{

/// <summary>

/// Перемножение матриц с использованием неровных массивов

/// </summary>

class MatrixMul

{

 

[ STAThread ]

static void Main ( string [] args )

{

int i, n;

 

// Объявляем неровные матрицы

double [][] MatrixA, MatrixB, MatrixC;

Random r = new Random ( 50 );

n = 1000;

 

MatrixA = new double [ n ][];

MatrixB = new double [ n ][];

MatrixC = new double [ n ][];

 

/* Создаем экземпляры массивов и инициализируем их */

for ( i = 0; i <;MatrixA. Length; i ++) {

MatrixA [ i ] = new double [ n ];

MatrixB [ i ] = new double [ n ];

MatrixC [ i ] = new double [ n ];

for ( int j = 0; j <;MatrixA [ i ]. Length; j ++) {

MatrixA [ i ][ j ]=( double ) r. Next ( 50 );

MatrixB [ i ][ j ]=( double ) r. Next ( 50 );

}

}

Counter counter = new Counter ();

 

/* Вызов и замер времени выполнения Matdot */

Console. WriteLine ( "Starting counter..." );

counter. Reset ();

counter. Start ();

Matdot ( MatrixA, MatrixB, MatrixC ); // вызов MatDot

counter. Stop ();

 

Console. WriteLine ( "Time taken: {0}", counter );

Console. WriteLine ( "Obtained {0:F2} MFlops",

counter. MFlops ( 2 * n * n * n ));

Console. ReadLine ();

}

 

public static void Matdot ( double [][] a, double [][] b,

double [][] c )

{

int i,j,k;

double tmp;

 

for ( i = 0; i <;a. Length; i ++)

{

for ( j = 0; j <;c [ i ]. Length; j ++)

{

tmp = c [ i ][ j ];

for ( k = 0; k <;b [ i ]. Length; k ++)

{

tmp += a [ i ][ k ]* b [ k ][ j ];

}

c [ i ][ j ]= tmp;

}

}

}

}

}

 

Листинг 8. Перемножение матриц с применением прямоугольных массивов

using System;

using System. Diagnostics;

using PerfCounter;

 

namespace BenchRectMatrix

{

/// <summary>

/// Перемножение матриц с использованием прямоугольных массивов

/// </summary>

class MatrixMul

{

 

[ STAThread ]

static void Main ( string [] args )

{

int i, n;

 

// Объявляем прямоугольные матрицы

double [,] MatrixA, MatrixB, MatrixC;

Random r = new Random ( 50 );

n = 1000;

 

MatrixA = new double [ n,n ];

MatrixB = new double [ n,n ];

MatrixC = new double [ n,n ];

 

/* Инициализируем случайными значениями */

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

{

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

{

MatrixA [ i,j ]=( double ) r. Next ( 50 );

MatrixB [ i,j ]=( double ) r. Next ( 50 );

}

}

 

Counter counter = new Counter ();

 

/* Вызов и замер времени выполнения Matdot */

Console. WriteLine ( "Starting counter..." );

counter. Reset ();

counter. Start ();

Matdot ( n, MatrixA, MatrixB, MatrixC ); // вызов MatDot

counter. Stop ();

 

Console. WriteLine ( "Time taken: {0}", counter );

Console. WriteLine ( "Obtained {0:F2} MFlops",

counter. MFlops ( 2 * n * n * n ));

Console. ReadLine ();

}

 

public static void Matdot ( int n, double [,] a, double

[,] b, double [,] c )

{

int i,j,k;

double tmp;

 

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

{

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

{

tmp = c [ i,j ];

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

{

tmp += a [ i,k ] * b [ k,j ];

}

c [ i,j ]= tmp;

}

}

}

}

}

 

 

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

 

Листинг 9.

 

double [] myArray = new double [ ROW_DIM * COLUMN_DIM ];

 

Рис. 3. Неровные массивы против прямоугольных

 

Для индексации элементов в таком массиве указывайте следующее смещение:

 







Дата добавления: 2015-08-29; просмотров: 437. Нарушение авторских прав; Мы поможем в написании вашей работы!




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


Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...


Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...


Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...

Весы настольные циферблатные Весы настольные циферблатные РН-10Ц13 (рис.3.1) выпускаются с наибольшими пределами взвешивания 2...

Хронометражно-табличная методика определения суточного расхода энергии студента Цель: познакомиться с хронометражно-табличным методом опреде­ления суточного расхода энергии...

ОЧАГОВЫЕ ТЕНИ В ЛЕГКОМ Очаговыми легочными инфильтратами проявляют себя различные по этиологии заболевания, в основе которых лежит бронхо-нодулярный процесс, который при рентгенологическом исследовании дает очагового характера тень, размерами не более 1 см в диаметре...

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

Типовые ситуационные задачи. Задача 1. Больной К., 38 лет, шахтер по профессии, во время планового медицинского осмотра предъявил жалобы на появление одышки при значительной физической   Задача 1. Больной К., 38 лет, шахтер по профессии, во время планового медицинского осмотра предъявил жалобы на появление одышки при значительной физической нагрузке. Из медицинской книжки установлено, что он страдает врожденным пороком сердца....

Типовые ситуационные задачи. Задача 1.У больного А., 20 лет, с детства отмечается повышенное АД, уровень которого в настоящее время составляет 180-200/110-120 мм рт Задача 1.У больного А., 20 лет, с детства отмечается повышенное АД, уровень которого в настоящее время составляет 180-200/110-120 мм рт. ст. Влияние психоэмоциональных факторов отсутствует. Колебаний АД практически нет. Головной боли нет. Нормализовать...

Studopedia.info - Студопедия - 2014-2025 год . (0.007 сек.) русская версия | украинская версия