Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Операции над матрицами, метод, реализующий проверку типа матрицы 
:(
    Опции темы
Tinysik2009
  Дата 24.1.2010, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 2.5.2009

Репутация: нет
Всего: нет



Здравствуйте, подскажите пожалуйста как реализовать следующую задачу:

Класс должен реализовывать операции над матрицами:
- методы, реализующие проверку типа матрицы(диагональная, нулевая,единичная);
- операции сравнения на равенство/неравенство.


Общими словами я хочу свою заданную матрицу проверить к какой матрице она относится к диагональной(это где все недиагональные элементы равны 0),единичной (элементы главной диагонали равны 1, а остальные равны нулю.) или нулевой (все элементы равны 0.), а затем сравнить их.





Код

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Matrix
    {
        static void Main(string[] args)
        {
            int m, n;
            m = 3; //stroki
            n = 3;//stolbci
            double[,] A = new double[m, n] { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } };

            for (int i = 0; i < m; ++i)
            {
                for (int j = 0; j < n; ++j)
                    Console.Write("\t" + A[i, j]);
                Console.WriteLine();
            }
        }
    }
}



Как это реализовать? Задать все эти матрицы и через цикл сравнить матрицу А с единичной,диагональной и нулевой?

PM MAIL   Вверх
Экскалупатор
Дата 24.1.2010, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



Цитата(Tinysik2009 @  24.1.2010,  16:21 Найти цитируемый пост)
Как это реализовать? Задать все эти матрицы и через цикл сравнить матрицу А с единичной,диагональной и нулевой? 

в общем виде да. это будет выглядеть приблизительно так. т.е. должен быть класс матрицы и у него должны быть методы которые будут все это определять.
в частности я бы наверное попробовал делать так:
для нулевой матрицы считать сумму всех элементов, она должна быть равна 0.
для диагональной считать сумму нужных элементов, она должна быть равна 0.
самое сложное с единичной. но я бы наверное попробовал считать сумму всех элементов(очевидно что она должна быть не больше количества строк в матрице) и при этом проверял что бы именно диагональные элементы были равны 1(т.е. элементы matrix[i,i]==1).

Это сообщение отредактировал(а) Экскалупатор - 24.1.2010, 22:55
PM MAIL ICQ   Вверх
KuMa1104
Дата 24.1.2010, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: 1
Всего: 3



Экскалупатор Привет!

Цитата(Экскалупатор @  24.1.2010,  22:54 Найти цитируемый пост)
для диагональной считать сумму нужных элементов, она должна быть равна 0.

Ам а можно вот это обяснить.Например матрица
Код

1 0 0
0 7 0
0 0 9

как тут ноль получаеться?

Имелся в виду определитель?
Определитель диагональной матрицы равен произведению всех элементов диагонали.

Это сообщение отредактировал(а) KuMa1104 - 24.1.2010, 23:15


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
diadiavova
Дата 24.1.2010, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(Экскалупатор @  24.1.2010,  22:54 Найти цитируемый пост)
для нулевой матрицы считать сумму всех элементов, она должна быть равна 0.

А если там кроме нулей есть две значащие величины, равные по модулю и противоположные по знаку, например? Нулевая сумма не всегда означает, что все слагаемые нули. Сумма модулей - другое дело, но и это ни к чему. Проще всё по правилам сделать не вижу тут никакой проблемы. 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Tinysik2009
  Дата 25.1.2010, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 2.5.2009

Репутация: нет
Всего: нет



  запутали меня еще больше =))) smile 
PM MAIL   Вверх
diadiavova
Дата 25.1.2010, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Tinysik2009, тебе нужно создать класс, который будет представлять из себя матрицу. Элементы можно хранить в массиве. А методы проверки могут выглядеть примерно следующим образом
Код

    class Matrix
    {
    /// <summary>
    /// Массив для хранения элементов матрицы
    /// </summary>
        private double[,] elements;
        public Matrix(int rows, int collumns)
        {
            elements = new double[rows, collumns];
        }
        /// <summary>
        /// Проверяем, является ли матрица нулевой
        /// </summary>
        /// <returns></returns>
        public bool IsZero()
        {
            foreach (double el in elements)
            {
                if (el != 0) return false;
            }
            return true;
        }
        /// <summary>
        /// Проверяем, является ли матрица квадратной
        /// </summary>
        /// <returns></returns>
        public bool IsQuad()
        {
            return elements.GetLength(0) == elements.GetLength(1);
        }
        /// <summary>
        /// Проверяем, является ли матрица единичной
        /// </summary>
        /// <returns></returns>
        public bool IsUnit()
        {
            if (IsZero() || !IsQuad()) return false;
            for (int r = 0; r < elements.GetLength(0); r++)
            {
                for (int c = 0; c < elements.GetLength(1); c++)
                {
                    if (
                        (r == c && elements[r, c] != 1) || (r != c && elements[r, c] != 0)
                        ) return false;
                }
            }
            return true;
        }
        /// <summary>
        /// Проверяем, является ли матрица диагональной
        /// </summary>
        /// <returns></returns>
        public bool IsDiagonal()
        {
            if (IsZero() || !IsQuad()) return false;
            for (int r = 0; r < elements.GetLength(0); r++)
            {
                for (int c = 0; c < elements.GetLength(1); c++)
                {
                    if (
                         (r != c && elements[r, c] != 0)
                        ) return false;
                }
            }
            return true;
        }
    }

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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Экскалупатор
Дата 25.1.2010, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



KuMa1104diadiavova, вы два маньяка, я предложил решение. оно не обязательно верное. 


Цитата(KuMa1104 @  24.1.2010,  22:14 Найти цитируемый пост)
Ам а можно вот это обяснить.
1 0 0
0 7 0
0 0 9

как тут ноль получаеться?

тут ноль получается если сложить все элементы кроме главной диагонали. это я исходя из определения:Диагональная матрица.


Цитата(diadiavova @  24.1.2010,  22:23 Найти цитируемый пост)

А если там кроме нулей есть две значащие величины, равные по модулю и противоположные по знаку, 

так можно же по модулю складывать... smile 
может сразу и не додумал, но ход мыслей в нужную сторону...

Это сообщение отредактировал(а) Экскалупатор - 25.1.2010, 01:20
PM MAIL ICQ   Вверх
diadiavova
Дата 25.1.2010, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(Экскалупатор @  25.1.2010,  01:19 Найти цитируемый пост)
так можно же по модулю складывать... 


Цитата(diadiavova @  24.1.2010,  23:23 Найти цитируемый пост)
Сумма модулей - другое дело, но и это ни к чему.
А зачем вообще что-то складывать? Я привёл пример как можно сделать. Это, конечно, набросок, но там вроде понятно всё и просто.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Экскалупатор
Дата 25.1.2010, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



не заметил

Это сообщение отредактировал(а) Экскалупатор - 25.1.2010, 01:24
PM MAIL ICQ   Вверх
diadiavova
Дата 25.1.2010, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(Экскалупатор @  25.1.2010,  01:23 Найти цитируемый пост)
т.е. если у нее число столбцов и строк одинаково. 

Опять таки в моём примере это дело проверяется и даже метод специальный есть smile

Добавлено через 52 секунды
А вообще: такие вопросы в центр помощи задавать надо.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Экскалупатор
Дата 25.1.2010, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



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

тогда можно так:
Код

public bool IsUnit()
        {
            if (!IsDiagonal()) return false;
            for (int r = 0; r < elements.GetLength(0); r++)
            {               
                    if (elements[r, r] != 1) return false;                
            }
            return true;
        }


Это сообщение отредактировал(а) Экскалупатор - 25.1.2010, 02:19
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1035 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.