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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите написать код! 
:(
    Опции темы
bsa
Дата 4.8.2011, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(W4FhLF @  4.8.2011,  13:41 Найти цитируемый пост)
Так что тут спорно.  

для создания матрицы достаточно просто вектора. Если очень хочется, то можно попробовать дек векторов...
PM   Вверх
W4FhLF
Дата 4.8.2011, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



И адресовать двумерные индексы через одномерные? Тогда можно. У меня в классе так и сделано. Просто гораздо удобнее оперировать двойными индексами.  


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
borisbn
Дата 4.8.2011, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



W4FhLF, можно хранить указатель на вектор
Код

std::vector< std::vector< double> * > m;
*(m[ i ])[ j ]

выглядит не так красиво, но, действительно, копирований не будет.
Нужно ещё не забыть выделить память в начале и при erase'е - удалить
Код

    std::vector< std::vector< double > * > matrix( range );
    for ( int i = 0; i < range; i++ )
        matrix[ i ] = new std::vector< double >( range );
    *(matrix[0])[0]=1; *(matrix[0])[1]=2; *(matrix[0])[2]=0; *(matrix[0])[3]=3; *(matrix[0])[4]=5;
    .....
    if ( allZeros ) {
        delete matrix[ i ];
        matrix.erase( matrix.begin() + i );
    }


Это сообщение отредактировал(а) borisbn - 4.8.2011, 14:36


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Silent
Дата 4.8.2011, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Раз матрица "большая", 4000х4000, то не надо выполнять лишних операций - аж два раза бегать по ней. Заведите себе два массивчика, посчитайте количество нулевых элементов в строке-столбце, и если значение равно N, то все понятно - выводить не стоит. Иллюстрирующий код:
Код

short index1[N], index2[N];    //indexX[i] <= 4000

for (int i = 0; i < N; i++)
    for (int j = 0; j < N; j++)
    {
        index1[i] += (matrix[i][j] == 0);    //помним, что сравнивать double надо не так
        index2[j] += (matrix[i][j] == 0);
    }


результат: плюс 16000 байт, минус N^2 операций, время выполнения этого участка наполовину уменьшается.

P.S. Кстати, рекомендую не применять двойную индексацию, и не применять динамические массивы. Хотя я, конечно, не знаю специфику задачи.

Это сообщение отредактировал(а) Silent - 4.8.2011, 14:40
PM MAIL   Вверх
W4FhLF
Дата 4.8.2011, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



borisbn, тогда обычный двумерный массив лучше. Кода столько же, а выглядит красивее. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
borisbn
Дата 4.8.2011, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Можно завернуть всё это безобразие в класс, использовать в нём простой вектор и переопределить оператор []
Код

class Vector2D
{
public:
    Vector2D( int range )
        : m_range( range )
    {
        m_matrix.resize( m_range * m_range );
    }
private:
    double & operator[]( int row ) { return m_matrix[ row * m_range ]; }
};

придётся подолбаться с ф-цией удаления строки и столбца (хотя тоже ничего военного... )


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
W4FhLF
Дата 4.8.2011, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



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

Код

    inline const T& operator()(int row, int col) const
    {
#ifdef _DEBUG
        if(row >= m_rows || col >= m_cols)
            throw std::out_of_range("You've tried to access element which is out of range.");
#endif
        return m_data[col + row * m_cols];
    }



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
hello19
Дата 5.8.2011, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нароод! помогиет!! 
Надо считать столбец свободных членов системы.
Решил просто проверить как работает. Считываю, записываю в массив, вывожу. Вот код:
Код

        int range;
    cin >> range;
    // Colum of free members
    double *free = new double[range];
    ifstream ifsf("B.txt");
    double q;
    int i = 0;
    int j = 0;
    while ( ifsf >> free[i] )
    {
        i++;
    }
    ifsf.close();
    ofstream ofs("B-0.txt");
    for ( int i = 0; i < range; i++ )
    {
        ofs << free[i] << endl;
    }
    ofs.close();

PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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