Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Классы для операции, матрицы 
:(
    Опции темы
recruit
Дата 29.11.2005, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Надо написать

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

Вот это мне дали, но мне нужно размерность квадратной матрицы равной n*n.

Тут нужно переписать ф-цию нахождения определителя и операцию нахождения обратной матрицы.

Так же не проверяется равенство определителя 0.

Помогите плиз, а то я в си не особо (




Файл заголовка "Matrix.h":


Код

const int iDimension=2;
class CMatrix
{
private:
        float Data[iDimension][iDimension];
public:
        CMatrix();
        ~CMatrix(){}
        float Determinant();
        friend CMatrix operator+(CMatrix&,CMatrix&);
        friend CMatrix operator-(CMatrix&,CMatrix&);
        friend CMatrix operator-(CMatrix&);
        friend CMatrix operator*(CMatrix&,CMatrix&);
        friend CMatrix operator*(float,CMatrix&);
        friend CMatrix operator*(CMatrix&,float);
        friend CMatrix operator/(CMatrix&,float);
        friend CMatrix operator!(CMatrix&);
        friend CMatrix operator~(CMatrix&);
        void InputMatrix();
        void PrintMatrix();
};


Фйл "Matrix.cpp":

Код

#include<iostream.h>
#include"Matrix.h"
CMatrix::CMatrix()
{
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        Data[i][j]=0;
}
void CMatrix::InputMatrix()
{
        cout<<"Please enter matrix("<<iDimension<<"x"<<iDimension<<"):\n";
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        cin>>Data[i][j];
}
void CMatrix::PrintMatrix()
{
        for(int i=0;i<iDimension;i++)
        {
                for(int j=0;j<iDimension-1;j++)
                        cout<<Data[i][j]<<" ";
                cout<<Data[i][iDimension-1]<<"\n";
        }
}
CMatrix operator +(CMatrix& a,CMatrix& b)
{
        CMatrix Result;
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        Result.Data[i][j]=a.Data[i][j]+b.Data[i][j];
        return Result;
}
CMatrix operator -(CMatrix& a,CMatrix& b)
{
        return a+((-1)*b);
}
CMatrix operator -(CMatrix& a)
{
        return a*(-1);
}
CMatrix operator *(CMatrix& a,CMatrix& b)
{
        CMatrix Result;
        for(int i=0;i<iDimension;i++) 
                for(int j=0;j<iDimension;j++)
                        for(int k=0;k<iDimension;k++)
                                Result.Data[i][j]=Result.Data[i][j]+a.Data[i][k]*b.Data[k][j]; 
        return Result;
}
CMatrix operator *(float a,CMatrix& b)
{
        CMatrix Result;
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        Result.Data[i][j]=a*b.Data[i][j];
        return Result;        
}
CMatrix operator *(CMatrix& a,float b)
{
        return b*a;        
}
CMatrix operator /(CMatrix& a,float b)
{
        return (1/b)*a;
}
float CMatrix::Determinant()
{ 
        return Data[0][0]*Data[1][1]-Data[0][1]*Data[1][0];
}
CMatrix operator !(CMatrix& a)
{
        CMatrix Result;
        for(int i=0;i<iDimension;i++)
                for(int j=0;j<iDimension;j++)
                        Result.Data[i][j]=a.Data[j][i];
        return Result;        
}
CMatrix operator ~(CMatrix& a)
{        
        CMatrix Result;
        float m=1/a.Determinant();
        Result.Data[0][0]=a.Data[1][1];
        Result.Data[0][1]=-a.Data[1][0];
        Result.Data[1][0]=-a.Data[0][1];
        Result.Data[1][1]=a.Data[0][0];
        Result=(!Result)*m;
        return Result;
}



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


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Пользуйтесь поиском! Вопросы по матрице раз в три дня тут.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
recruit
Дата 30.11.2005, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



поискал, ничего не нашел
PM MAIL   Вверх
Alexandr87
Дата 30.11.2005, 06:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



Сишного компилятора нет, могу помочь только советом.
Внеси размерность массива в класс, и соотвественно при вводе, спрашивай размерность, выделяй память и записывай.
Сделай дополнительный конструктор с параметрами -размерность, массив данных.
Затем создай три метода
double getM(int row,int col) - минор
double getA(int row,int col) - алгебр. дополнение
double getD()-собственно сам детерминант

getM() - возвращает результат getD() для матрицы минора (матрица без столбца и строки int row,int col [вот здесь тебе и понадобиться конструктор описанный выше])
getA() - возвращает алгебраическое дополнение используя getM()
getD()- возвращает - единственный элемент массива данных, если размерность равна 1, в другом случае получает определитель разложение по первому столбцу, т.е.
Код

double temp=0.0;
if (iDimension==1) {
  return Data[0][0];
}
for (int x:=0; x<iDimension; x++) {
  temp+=Data[x][0]*getA(x,0);
}
return temp;

Вот такая рекурсия.

PM Jabber   Вверх
recruit
Дата 30.11.2005, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



попробую спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

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


 




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


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

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