Форум программистов, компьютерный форум CyberForum.ru

Как изменить размерность матрицы - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
21.07.2011, 21:59     Как изменить размерность матрицы #1
Помогите плз. Мне нужно просграммно поменять размерность матрицы. Например была матрица mat[5][5]
а должна получиться после определенных вычислений mat[6][7]. Буду очень благадарен.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
21.07.2011, 22:10     Как изменить размерность матрицы #2
Так ты просто объяви матрицу [6][7] и всё, и скопируй содержимое [5][5] в [6][7] как тебе надо
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.07.2011, 22:14     Как изменить размерность матрицы #3
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdlib.h>
 
int main()
{
    const int P = 5;
    const int Q = 6;
    const int R = 7;
    int** matr = (int**)malloc(P * sizeof(int*));
    int i = 0;
    for (; i < P; ++i)
        matr[i] = (int*)malloc(P * sizeof(int));
/* some code */
    matr = (int**)realloc(matr, Q * sizeof(int*));
    for (i = 0; i < Q; ++i)
        matr[i] = (int*)realloc(matr, R * sizeof(int));
/* some code */
    for (i = 0; i < Q; ++i)
        free(matr[i]);
    free(matr);
    return 0;
}
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
21.07.2011, 22:49     Как изменить размерность матрицы #4
gr_8_zizu,

Как вариант:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <vector>
#include <iostream>
#include <algorithm>
 
void GenerateMatrix(std::vector <std::vector <int> > & matrix, std::size_t SIZE)
{
    matrix.resize(SIZE);
    
    std::for_each(matrix.begin(), matrix.end(), [SIZE](std::vector <int>& vec) { 
        vec.resize(SIZE);
    } );
    
    std::generate(matrix.begin(), matrix.end(), [SIZE]() {
        std::vector <int> temp;
        temp.resize(SIZE);
        int current = 0;
        std::generate(temp.begin(), temp.end(), [&current]() {
            return current++;
        } );
        
        return temp;
    } );
}
 
void OutMatrix(std::vector <std::vector <int> > & matrix)
{
    for (std::size_t i = 0; i < matrix.size(); i++)
    {
        std::cout << std::endl;
        for (std::size_t j = 0; j < matrix[i].size(); j++)   
            std::cout << matrix[i][j] << " ";
    }
    std::cout << std::endl;
}
 
int main()
{
    std::vector <std::vector <int> > matrix;
    const int SIZE = 5;
    const int NEW_SIZE = 6;
    
    GenerateMatrix(matrix, SIZE);
    OutMatrix(matrix);          
        
    GenerateMatrix(matrix, NEW_SIZE);
    OutMatrix(matrix);
    
    return 0;
}
http://liveworkspace.org/code/d5736d...0aa7288e656b24
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
21.07.2011, 23:01     Как изменить размерность матрицы #5
Цитата Сообщение от nameless Посмотреть сообщение
C++
1
2
3
4
matrix.resize(SIZE);
std::for_each(matrix.begin(), matrix.end(), [SIZE](std::vector <int>& vec) { 
  vec.resize(SIZE);
  } );
Можно еще так:
C++
1
2
std::vector<std::vector<int>> m(SIZE, std::vector<int>(SIZE));
std::swap(matrix, m);
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
22.07.2011, 00:13  [ТС]     Как изменить размерность матрицы #6
Я прошу прощения я немного не уточнил, какой размерности будет матрица будет извесно только в ходе выполнения, тоесть по определенному алгоритму. Мне необходимо просто расширить матрицу. Но я продумывал вариан, такой как просто создание новой матрицы при помощи например new. Но вот тут возникла небольшая проблема, для одномерных массивов этот вариант работает хорошо, но вот для двумерного в маем случае уже ругается. Может быть кто нить знает как с этим бороться. Было бы не плохо узнать, а то я уже и алгоритм под этот случая разобрал. Выручайте!

Добавлено через 2 минуты
Цитата Сообщение от nameless Посмотреть сообщение
gr_8_zizu,

Как вариант:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <vector>
#include <iostream>
#include <algorithm>
 
void GenerateMatrix(std::vector <std::vector <int> > & matrix, std::size_t SIZE)
{
    matrix.resize(SIZE);
    
    std::for_each(matrix.begin(), matrix.end(), [SIZE](std::vector <int>& vec) { 
        vec.resize(SIZE);
    } );
    
    std::generate(matrix.begin(), matrix.end(), [SIZE]() {
        std::vector <int> temp;
        temp.resize(SIZE);
        int current = 0;
        std::generate(temp.begin(), temp.end(), [&current]() {
            return current++;
        } );
        
        return temp;
    } );
}
 
void OutMatrix(std::vector <std::vector <int> > & matrix)
{
    for (std::size_t i = 0; i < matrix.size(); i++)
    {
        std::cout << std::endl;
        for (std::size_t j = 0; j < matrix[i].size(); j++)   
            std::cout << matrix[i][j] << " ";
    }
    std::cout << std::endl;
}
 
int main()
{
    std::vector <std::vector <int> > matrix;
    const int SIZE = 5;
    const int NEW_SIZE = 6;
    
    GenerateMatrix(matrix, SIZE);
    OutMatrix(matrix);          
        
    GenerateMatrix(matrix, NEW_SIZE);
    OutMatrix(matrix);
    
    return 0;
}
http://liveworkspace.org/code/d5736d...0aa7288e656b24
спасибо за помощь, но вот клас вектор для меня вообще темный лес, и боюсь если залезу то долго вылезать буду, а мне работу надо до сентября месяца здать. Так что лучше примерчик с int массивами написал бы, и все равно спасибо.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
22.07.2011, 00:34     Как изменить размерность матрицы #7
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
Но я продумывал вариан, такой как просто создание новой матрицы при помощи например new. Но вот тут возникла небольшая проблема, для одномерных массивов этот вариант работает хорошо, но вот для двумерного в маем случае уже ругается.
А какой твой случай-то?
C++
1
2
3
 int** p;
 for (int i; i< 6; i++)
  p[i]= new int [8];
Вот и вся матрица, вместо 6 подставь количество строк, вместо 8 количество столбцов. Главное- скопировать нужным образом, я говорил уже. А как копировать я ума не приложу, чё у тебя за алгоритм.
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
22.07.2011, 00:49  [ТС]     Как изменить размерность матрицы #8
Цитата Сообщение от kravam Посмотреть сообщение
А какой твой случай-то?
C++
1
2
3
 int** p;
 for (int i; i< 6; i++)
  p[i]= new int [8];
Вот и вся матрица, вместо 6 подставь количество строк, вместо 8 количество столбцов. Главное- скопировать нужным образом, я говорил уже. А как копировать я ума не приложу, чё у тебя за алгоритм.
Под случаем я имел ввиду двумерный массив объявить надо. И не получается пример который ты написал, пишет:"... 'Acces violation at address 00401379'..."
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
22.07.2011, 00:53     Как изменить размерность матрицы #9
Нужно так:
C++
1
2
3
4
5
6
7
int **p = new int*[6];
for(int i = 0; i < 6; ++i)
  p[i] = new int[8];
//Удаление
for(int i = 0; i < 6; ++i)
  delete[] p[i];
delete[] p;
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
22.07.2011, 00:59  [ТС]     Как изменить размерность матрицы #10
Цитата Сообщение от asics Посмотреть сообщение
Нужно так:
C++
1
2
3
4
5
6
7
int **p = new int*[6];
for(int i = 0; i < 6; ++i)
  p[i] = new int[8];
//Удаление
for(int i = 0; i < 6; ++i)
  delete[] p[i];
delete[] p;
Спасибо уже получилось. А зачем его потом удалять? Если он мне нужен будет все время им же можно будет пользоваться как обычным массивом или он только временным может быть?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
22.07.2011, 01:02     Как изменить размерность матрицы #11
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
Если он мне нужен будет все время им же можно будет пользоваться как обычным массивом
Да.
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
или он только временным может быть?
Когда он вам станет не нужен, тогда и удалите память, я так понимаю в вашей ситуации -- в конце программы.
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
22.07.2011, 01:05  [ТС]     Как изменить размерность матрицы #12
Когда он вам станет не нужен, тогда и удалите память, я так понимаю в вашей ситуации -- в конце программы.[/QUOTE]

Этот массив и будет являться результатом моей программы только немного преобразованный. А доступ к такому массиву такойже как и к обычному? и как с адресами в таком случае?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
22.07.2011, 01:08     Как изменить размерность матрицы #13
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
А доступ к такому массиву такойже как и к обычному?
Да.
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
и как с адресами в таком случае?
Этого не понял.
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
22.07.2011, 01:27  [ТС]     Как изменить размерность матрицы #14
ну в обычном массиве адреса элементов распологаются подрят, а в этом случае так же? Или тут подрят идут адреса только строк, а столбцов уже могут распологаться в другом месте, или все идет подрят как в обычном массиве?

Добавлено через 11 минут
Например: если работать с указателями, то адрес pArray+1 будет в соседнем байте с pArray так?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
22.07.2011, 01:48     Как изменить размерность матрицы #15
Думаю так будет понятно: pArry[i][j] <=> *(*(pArray + i) + j)

Добавлено через 41 секунду
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
ну в обычном массиве адреса элементов распологаются подрят, а в этом случае так же?
Это и есть обычный масив, только память мы под него выделили динамически.
prZzZ
Программист
 Аватар для prZzZ
108 / 88 / 5
Регистрация: 22.03.2011
Сообщений: 232
22.07.2011, 01:50     Как изменить размерность матрицы #16
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
ну в обычном массиве адреса элементов распологаются подрят, а в этом случае так же? Или тут подрят идут адреса только строк, а столбцов уже могут распологаться в другом месте, или все идет подрят как в обычном массиве?
Да, вы совершенно правы. Работа с массивами и указателями на массив ведется идентично - единственное, что надо иметь ввиду - это передача в функции, если вы передаете функции, ожидающей, скажем, например? int** int[5][5], то в данном случае требуется явное преобразование - либо прототип функции описывать явно.
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
22.07.2011, 02:13  [ТС]     Как изменить размерность матрицы #17
Всем спасибо, разобрался, все получилось!
CoffeeSamurai
2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 19
22.07.2011, 14:14     Как изменить размерность матрицы #18
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
Спасибо уже получилось. А зачем его потом удалять? Если он мне нужен будет все время им же можно будет пользоваться как обычным массивом или он только временным может быть?
Затем, что здесь создается динамический массив, а 6 - это его максимальный размер. После использования динамической памяти, её надо очистить с помощью delete.
Сомневаюсь что массив тебе будет нужен после окончания работы программы.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
22.07.2011, 15:39     Как изменить размерность матрицы #19
По окончании работы динамический массив удалится сам. Но всё равно нужно приучать себя удалять принудительно. Потом это умение и привычка воздастся сторицей.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2011, 19:20     Как изменить размерность матрицы
Еще ссылки по теме:

Размерность матрицы C++
C++ Как из файла прочитать размерность матрицы и её содержимое?
Задать размерность матрицы с клавиатуры C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.07.2011, 19:20     Как изменить размерность матрицы #20
Цитата Сообщение от kravam Посмотреть сообщение
По окончании работы динамический массив удалится сам
вы со своим классом матрицы не перепутали случайно?
Yandex
Объявления
22.07.2011, 19:20     Как изменить размерность матрицы
Ответ Создать тему
Опции темы

Текущее время: 15:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru