Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 12.11.2009, 19:25   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Типичные задачи и примеры. Теория.

ИМХО всем уже надоели одни и те же вопросы по матрицам. Посылаешь их в поиск, посылаешь, а они все пишут и пишут и пишут...
P.S. Если тема нужная - прикрепите, пожалуйста.
------------------------------------------------------------
Определение матрицы:
Матрица - это множество чисел, сгруппированных в столбцы и строки.

Пример матрицы:
Код:
5,4,5,4,3
2,3,4,5,6
1,9,6,4,3
Данная матрица имеет 3 строки и 5 столбцов.

Главная диагональ:
Главная диагональ имеется только у квадратных матриц и координаты точек главной диагонали задаются следующей формулой:
Код:
A[N,N], где N - число от 1 до максимального значения в данной матрице
Где она расположена:
Код:
1,0,0,0,0
0,1,0,0,0
0,0,1,0,0
0,0,0,1,0
0,0,0,0,1
(Единицы - элементы главной диагонали)

Побочная диагональ:
Побочная диагональ также определяется только у квадратных матриц и задается следующей формулой:
Код:
A[N,MAX-N+1], где N-число от 1 до максимального значения в данной матрице; MAX - размерность матрицы
Пример побочной диагонали:
Код:
0,0,0,0,1
0,0,0,1,0
0,0,1,0,0
0,1,0,0,0
1,0,0,0,0
Как определить, находится ли элемент ниже\на\выше главной диагонали:
Для этого мы воспользуемся формулой главной диагонали - A[N,N].
Код HTML:
Если X>Y Тогда элемент выше главной диагонали.
Если X=Y Тогда элемент на главной диагонали.
Eckb X<Y Тогда элемент ниже главной диагонали.
Аналогично для побочной диагонали, только условие изменяется согласно формуле главной диагонали:
Код HTML:
Если X>Y-MAX+1 Тогда выше
Если X=Y-MAX+1 Тогда на
Если X<Y-MAX+1 Тогда ниже
Как поменять местами два элемента диагонали:
Для этого воспользуемся старым как мир способом ПРОМЕЖУТОЧНОЙ ПЕРЕМЕННОЙ (ПП):
Обозначения:
A - первый перемещаемый элемент,
B - второй перемещаемый элемент,
PP - промежуточная переменная.
Код:
PP = A
A = B
B = PP
Пример программы на паскале:
Код:
Program moving;
Var
 Matrix:Array[1..3,1..3] of byte = (2,2,2,3,3,3,1,1,1);
 PP:Byte;
 X,Y:Byte;
Begin
 Writeln('До');
 For Y:=1 to 3 do
  Begin 
    For X:=1 to 3 do
     Write(Matrix[X,Y],' ');
    Writeln;
  End;
 PP := Matrix[3,3];
 Matrix[3,3] := Matrix[1,1];
 Matrix[1,1] := PP;
 Writeln('После');
  For Y:=1 to 3 do
  Begin 
    For X:=1 to 3 do
     Write(Matrix[X,Y],' ');
    Writeln;
  End;
  ReadLn;
End.
Максимальный элемент:
Максимальный элемент матрицы - это ячейка матрицы, имеющая максимальное значение. Максимальных элементов может быть несколько.
Пример:
Код:
2,3
9,1
Здесь 9 - Максимальный элемент матрицы.

Как найти максимальный элемент:
Для этого необходимо использовать метод пузырька (другое название - метод коробочки). В чем он заключается? Проще простого:
Код:
1. Берем первый элемент и кладем его в коробку.
2.Берем следующий элемент и если он больше того, что лежит в коробке - опустошаем коробку и положим туда данный элемент.
3. Идите на шаг 2, пока не закончатся элементы.
4. В коробке - максимальный элемент.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума
Старый 12.11.2009, 19:25   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Минимальный элемент ищется аналогично, только условие стоит наоборот: в коробку кладется наименьший элемент.

Реализация на паскале:
Код:
Program maximum;
Var
 Matrix:Array[1..3,1..3] of byte = (2,2,2,3,3,3,1,1,1);
 PP:Byte;
 X,Y:Byte;
Begin
 Writeln('До');
 For Y:=1 to 3 do
  Begin 
    For X:=1 to 3 do
     Write(Matrix[X,Y],' ');
    Writeln;
  End;
 PP := Matrix[1,1];
 For Y:=1 to 3 do
  For X:=1 to 3 do
   if Matrix[X,Y] > PP Then PP := Matrix[X,Y];
 Writeln('Mаксимум - ', PP);
  ReadLn;
End;
Поменять местами минимальный и максимальный элементы:
Аналогично примеру ищем максимальный и минимальный элементы и меняем их местами:
Код:
Program ReplaceMinAndMax;
Var
 Matrix:Array[1..3,1..3] of Byte = (1,2,3,4,5,6,7,8,9);
 PP:Byte;
 Max,Min:Byte;
 XMin,YMin,XMax,Ymax:Byte;
 X,Y:Byte;
Begin
 XMin := 1;
 YMax := 1;
 XMax := 1;
 YMax := 1;
 Max := Matrix[1,1];
 Min := Matrix[1,1];
 For Y := 1 to 3 do
  For X := 1 to 3 do
   Begin
    If Matrix[X,Y] > Max Then  Begin Max := Matrix[X,Y]; XMax := X; YMax := Y; End;
    If Matrix[X,Y] < Max Then Begin Min := Matrix[X,Y]; XMin := X; YMin := Y; End;
   End;
 PP := Matrix[XMax,YMax];
 Matrix[XMax,YMax] := Matrix[Xmin,YMin];
 Matrix[XMin,YMin] := PP;
End.
P.S. Эту задач можно решить не используя переменные Max и Min. Подумайте, как.

Как поменять местами строки:
Одно из распространенных заданий, но решается оно до банальности просто:
Код:
For X := 1 to MatrixXSize do
Begin
 PP := Matrix[X,Y1];
 Matrix[X,Y1] := Matrix[X,Y2];
 Matrix[X,Y2] := PP;
End;
Комбинируя вышеприведенные примеры можно решить любую задачу, по теме матрицы.

P.S. Если я что-то упустил - напомните, пожалуйста.
P.P.S. Если кто-то переведет вышеприведенные примеры на другие языки - статья обретет большую внутрифорумную репутацию.
P.P.P.S. 2Студенты! В этой теме постить задания НЕ НАДО!
P.P.P.P.S. (c) Копирайт Alex Cones 2009.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 12.11.2009 в 19:27.
Alex Cones вне форума
Старый 13.11.2009, 07:58   #3
kaa1977
Пользователь
 
Регистрация: 13.05.2009
Сообщений: 39
По умолчанию

а существуют ли в Delphi уже созданные функции (или целые библиотеки функций) для работы с матрицами?

Например, расчёт определителя, сложение матриц и так далее...

Понятно, что можно взять справочник по математике (того же Бронштейна), там всё расписано, и всё это сделать, но неужели нет уже сделанных функций
kaa1977 вне форума
Старый 13.11.2009, 09:15   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ну я знач малость покритикую старавши довести автора до кондиции
Цитата:
Как поменять местами два элемента диагонали:
Код конечно красивый, но есть пара но:
Дело в том что паскль не очень то любит если в разделе Var идет присваивание. Это раз
Второе - обьявлен двумерный массив Array[1..3,1..3], а присваивается как линейный - = (2,2,2,3,3,3,1,1,1);
Некузяво... Может какая-то школьная версия паскаля такое и прохавает, но...

Посему решил предложить свой вариант - А заодно соригинальничать:
Код:
Const
 Matrix:Array[1..3,1..3] of byte = ((2,2,2),(3,3,3),(1,1,1));
var
 PP:Byte;
 X,Y:Byte;
Begin
 Writeln('После');
 For Y:=1 to 3 do
  Begin
    For X:=1 to 3 do
     if (x*y) in [1,9] then
      Write(Matrix[3-X+1,3-Y+1],' ')
     else
      Write(Matrix[X,Y],' ');
    Writeln;
  End;
  ReadLn;
End.
Этак нам ничего менять в массиве не нужно, просто выведем мы при определенных условиях из противоположных координат.
Кста, тот метод инвертирования координат достаточно эффективен при огромных массивах.
Надеюсь понятно что нужно и в остальных примерах слегка поправить описание массива.
I'm learning to live...

Последний раз редактировалось Stilet; 13.11.2009 в 09:18.
Stilet вне форума
Старый 25.12.2009, 23:56   #5
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Дополню примеры на языках Си и Си++

Как поменять местами два элемента диагонали:
Пример на Си
Код:
#include <stdio.h>
#define SIZE 3
int main()
{
	int matrix[SIZE][SIZE] = { {2, 2, 2}, 
       			        		  {3, 3, 3}, 
						  {1, 1, 1}};
	int PP = 0;
	int X, Y;
	puts("До");
	for (Y = 0; Y < SIZE; Y++)
	{
		for (X = 0; X < SIZE; X++)
			printf("%d ", matrix[X][Y]);
		puts("");
	}
	PP = matrix[2][2];
	matrix[2][2] = matrix[0][0];
	matrix[0][0] = PP;
	puts("После");
	for (Y = 0; Y < SIZE; Y++)
	{
		for (X = 0; X < SIZE; X++)
			printf("%d ", matrix[X][Y]);
		puts("");
	}
	getchar();
	return 0;
}
Пример на Си++
Код:
#include <iostream>
const int SIZE = 3;
using namespace std;
int main()
{
	int matrix[SIZE][SIZE] = {{2, 2, 2}, 
						{3, 3, 3}, 
						{1, 1, 1}};
	int PP = 0;
	int X, Y;
	cout << "До" << endl;
	for (Y = 0; Y < SIZE; Y++)
	{
		for (X = 0; X < SIZE; X++)
			cout << matrix[X][Y] << " ";
		cout << endl;
	}
	PP = matrix[2][2];
	matrix[2][2] = matrix[0][0];
	matrix[0][0] = PP;
	cout << "После" << endl;
	for (Y = 0; Y < SIZE; Y++)
	{
		for (X = 0; X < SIZE; X++)
			cout << matrix[X][Y] << " ";
		cout << endl;
	}
	cin.get();
	return 0;
}
Поиск максимального элемента:
Пример на Си
Код:
int main()
{
	int matrix[SIZE][SIZE] = {{2, 2, 2}, 
						{3, 3, 3}, 
						{1, 1, 1}};
	int PP = 0;
	int X, Y;
	for (Y = 0; Y < SIZE; Y++)
	{
		for (X = 0; X < SIZE; X++)
			printf("%d ", matrix[X][Y]);
		puts("");
	}
	PP = matrix[0][0];
	for (Y = 0; Y < SIZE; Y++)
		for (X = 0; X < SIZE; X++)
			if (matrix[X][Y] > PP) PP = matrix[X][Y];
	printf("Maximum - %d", PP);
	getchar();
	return 0;
}
Пример на Си++
Код:
int main()
{
	int matrix[SIZE][SIZE] = {{2, 2, 2}, 
						{3, 3, 3}, 
						{1, 1, 1}};
	int PP = 0;
	int X, Y;
	for (Y = 0; Y < SIZE; Y++)
	{
		for (X = 0; X < SIZE; X++)
			cout << matrix[X][Y] << " ";
		cout << endl;
	}
	PP = matrix[0][0];
	for (Y = 0; Y < SIZE; Y++)
		for (X = 0; X < SIZE; X++)
			if (matrix[X][Y] > PP) PP = matrix[X][Y];
	cout << "Maximum - " << PP << endl;
	cin.get();
	return 0;
}
Поменять местами минимальный и максимальный элементы:
Для конкретного языка подключить соответствующие библиотеки и вместо комментария "//Вывод" выбрать соответствующий способ
Код:
int main()
{
	int matrix[SIZE][SIZE] = {{2, 2, 2}, 
					        {3, 3, 3}, 
						{1, 1, 1}};
	int PP = 0;
	int X, Y;
	int Max, Min;
	int XMin, YMin, XMax, YMax;
	Max = Min = XMax = YMax = XMin = YMin = 1;
	for (Y = 0; Y < SIZE; Y++)
		for (X = 0; X < SIZE; X++)
		{
			if (matrix[X][Y] > Max) {Max = matrix[X][Y]; XMax = X; YMax = Y;}
			if (matrix[X][Y] < Max) {Min = matrix[X][Y]; XMin = X; YMin = Y;}
		}
	PP = matrix[XMax][YMax];
	matrix[XMax][YMax] = matrix[XMin][YMin];
	matrix[XMin][YMin] = PP;
       // Вывод
	return 0;
}

Как поменять местами строки:

Код:
for (X = 0; X < MatrixSize; X++)
{
	PP = matrix[X][Y1];
	matrix[X][Y1] = matrix[X][Y2];
	matrix[X][Y2] = PP;
}
P.S. В принципе различие в объявлении константы SIZE и способе вывода, а так все одинаково
P.P.S. (с) Копирайт psycho-coder 2009.
Модераторам: Может тему прикрепить?

Последний раз редактировалось psycho-coder; 26.12.2009 в 00:13.
psycho-coder вне форума
Старый 19.01.2010, 21:20   #6
pacing
Новичок
Джуниор
 
Регистрация: 19.01.2010
Сообщений: 2
По умолчанию

А как найти умножения не парных елементов квадратной матрици више главной диагонали???
pacing вне форума
Старый 19.01.2010, 22:01   #7
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

pacing
из приведенных выше примерах, можно догадаться как, вам все разжевали что и как
Цитата:
Главная диагональ:
Главная диагональ имеется только у квадратных матриц и координаты точек главной диагонали задаются следующей формулой:
Код:

A[N,N], где N - число от 1 до максимального значения в данной матрице

Где она расположена:
Код:

1,0,0,0,0
0,1,0,0,0
0,0,1,0,0
0,0,0,1,0
0,0,0,0,1

(Единицы - элементы главной диагонали)
Вот посмотрите какие элементы здесь находятся выше главной диагонали, вот их произведение вам и нужно найти(не парных это скорей всего которые не стоят друг с другом)

Последний раз редактировалось Базиля; 19.01.2010 в 22:14.
Базиля вне форума
Старый 19.01.2010, 22:37   #8
golodnyy
Новичок
Джуниор
 
Регистрация: 19.01.2010
Сообщений: 1
По умолчанию Произведение матриц

Подскажите алгоритм перемножения матриц A[n,n] и В [n,n].
golodnyy вне форума
Старый 20.01.2010, 01:38   #9
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Лампочка

Цитата:
Подскажите алгоритм перемножения матриц A[n,n] и В [n,n].
Каждый элемент матрицы C (C=A*B) равен сумме произведений элементов i-й строки матрицы A на соответсвующие элементы j-го столбца матрицы B: Cij=Сумм(Aik*Bkj), где k=1,n

A(nxm)*B(mxr)=C(nxr)

Умножение матриц не подчиняется коммутативному закону - то есть A*B не равно B*A...

Добавлено от модератора: перемножение матриц (A x B) определено только в том случае, если количество столбцов матрицы A совпадает с количеством строк матрицы B. Если такое соотношение не выполняется, то произведение не существует/не определено. Поэтому формулировка A*B <> (не равно) B*A - некорректна. Сравнивать можно только однородные объекты - если произведение матриц B*A неопределено, то оно не является матрицей, оно вообще ничем не является.
I am the First of Cyber Evolution...
I am the First to Program your Future...

Последний раз редактировалось Вадим Мошев; 03.01.2016 в 21:33.
DomiNick вне форума
Старый 12.03.2010, 16:19   #10
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

как-то писал под заказ решение СЛАУ, выкладываю часть исходников
примеры работы с матрицами на C#, нахождение определителя матрицы любой размерности, транспонирование матрицы, умножение матриц между собой и на число, сложение матриц, решение СЛАУ методом Крамера, диагональные матрицы, с помощью этих реализаций решить СЛАУ можно будет практически любым способом

Код:
class Matrix 
{
    readonly int Rx; //кол-во строк матрицы
    readonly int Ry; // кол-во столбцов
    public int GetHeight() { return Rx; } // через этот метод получаем кол-во строк матрицы
    public int GetWidth() { return Ry; }
    public double[,] Matr; //массив, где хранятся значения элементов матрицы
    public Matrix(int R, int C) 
    {
        Rx = R;
        Ry = C;
        Matr = new double[Rx, Ry];
    }
    public Matrix DiagonalMatrix(double d) //диагональная матрица с коэффициентом d по диагонали
    {
        Matrix A = new Matrix(Ry, Ry);
        A = A.NullMatrix();
        for (int i = 0; i < A.Rx; i++) { A.Matr[i, i] = d; } //заполняем диагональ
        return A;
    }
    public Matrix TransMatrix() // транспонированная матрица
    {
        Matrix A = new Matrix(Ry, Rx);
        for (int i = 0; i < A.Rx; i++) { for (int j = 0; j < A.Ry; j++) { A.Matr[i, j] = Matr[j, i]; } }
        return A;
    }
    public double det() // определитель матрицы
    {
        Matrix A = new Matrix(Rx, Ry);
        for (int i = 0; i < A.Rx; i++) { for (int j = 0; j < A.Ry; j++) { A.Matr[i, j] = Matr[i, j]; } }
        double temp = 0;
        int N = A.Rx - 1;
        int h = 1; int v = N;
        double c = 0;
        for (int i = 0; i < A.GetHeight(); i++)
        {
            if (A.Matr[i, i] == 0)
            {
                for (int j = 0; j < A.Ry; j++)
                {
                    c = A.Matr[i + 1, j];
                    A.Matr[i + 1, j] = A.Matr[i, j];
                    A.Matr[i, j] = c;
                }
            }
        }
        if (A.Rx != A.Ry) { return 0; }
        else
        {
            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < v; j++)
                {
                    temp = A.Matr[j + h, i] / A.Matr[i, i];                        
                    for (int k = 0; k < A.Ry; k++) { A.Matr[j + h, k] = A.Matr[j + h, k] - A.Matr[i, k] * temp; } 
                }
                h++;
                v--;
            }
            temp = A.Matr[0, 0];
            for (int i = 1; i < A.Rx; i++) { temp *= A.Matr[i, i]; }
            return temp;
        }
    }
    public static Matrix operator *(Matrix M1, Matrix M2) // перегрузка оператора, т.е. можно умножать матрицы между собой
    {
        Matrix A = new Matrix(M1.Rx, M2.Ry);
        for (int i = 0; i < M1.Rx; i++)
        {
            for (int j = 0; j < M2.Ry; j++)
            {
                for (int k = 0; k < M1.Ry; k++) { A.Matr[i, j] += M1.Matr[i, k] * M2.Matr[k, j]; }
            }
        }
        return A;
    }
    public static Matrix operator *(double N, Matrix M) // умножение числа на матрицу
    {
        Matrix A = new Matrix(M.Rx, M.Ry);
        for (int i = 0; i < M.Rx; i++) { for (int j = 0; j < M.Ry; j++) { A.Matr[i, j] = M.Matr[i, j] * N; } }
        return A;
    }
    public static Matrix operator +(Matrix M1, Matrix M2) // сложение матриц
    {
        Matrix A = new Matrix(M1.Rx, M2.Ry);
        for (int i = 0; i < M1.Rx; i++) { for (int j = 0; j < M1.Ry; j++) { A.Matr[i, j] = M1.Matr[i, j] + M2.Matr[i, j]; } }
        return A;
    }
    public static Matrix operator /(Matrix M1, Matrix M2) // решение СЛАУ методом Крамера
    {
        Matrix A = new Matrix(M2.Rx, M2.Ry);
        Matrix D = new Matrix(M1.Rx, M1.Ry);
        Matrix V = new Matrix(M2.Rx, M2.Ry);
        for (int i = 0; i < M1.Rx; i++) { for (int j = 0; j < M1.Ry; j++) { D.Matr[i, j] = M1.Matr[i, j]; } }
        double temp = M1.det();
        double fg = 0;
        for (int i = 0; i < M1.Ry; i++)
        {
            for (int j = 0; j < M1.Rx; j++)
            {
                V.Matr[j, 0] = D.Matr[j, i];
                D.Matr[j, i] = M2.Matr[j, 0];
            }
            fg = D.det();
            A.Matr[i, 0] = fg / temp;
            for (int j = 0; j < M1.Rx; j++) { D.Matr[j, i] = V.Matr[j, 0]; }
        }
        return A;
    }
}
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]

Последний раз редактировалось RUSt88; 12.03.2010 в 16:26.
RUSt88 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Теория вероятности. Решить 2 задачи Worldqwerty Помощь студентам 2 14.01.2013 14:52
Типичные задачи на С++ Heming Помощь студентам 3 15.10.2012 11:13
Теория языков программирования и проектирование компиляторов (задачи) Onni Помощь студентам 0 03.06.2012 21:18
Теория информации + теория её передачи. vedro-compota Общие вопросы по программированию, компьютерный форум 4 23.10.2010 10:06
решение инженерных задач современными средствами компьютерной техники и типичные задачи автоматизированны Дініс Свободное общение 1 12.09.2009 00:02