Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/30: Рейтинг темы: голосов - 30, средняя оценка - 4.67
13 / 8 / 3
Регистрация: 07.01.2011
Сообщений: 149
1

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

21.07.2011, 21:59. Показов 5859. Ответов 27
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите плз. Мне нужно просграммно поменять размерность матрицы. Например была матрица mat[5][5]
а должна получиться после определенных вычислений mat[6][7]. Буду очень благадарен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.07.2011, 21:59
Ответы с готовыми решениями:

Как самому задать размерность матрицы?
Здрасьте! У меня есть кусочек кода, где создаётся матрица размерностью 12х12. Как мне самому...

Как из файла прочитать размерность матрицы и её содержимое?
Помогите пожалуйста, ничего не нашёл! Как из файла прочитать размерность матрицы и её содержимое?

Как сделать так чтобы можно было задавать размерность матрицы самому
Вот код, как сделать чтобы задавать размерность матрицы самому? #include <iomanip> // Библиотека...

Изменить программу, чтобы размерность массива определялась динамически
то есть надо применить функцию new #include <vcl.h> #include <stdio.h> #pragma hdrstop #pragma...

27
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
21.07.2011, 22:10 2
Так ты просто объяви матрицу [6][7] и всё, и скопируй содержимое [5][5] в [6][7] как тебе надо
1
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
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;
}
1
Эксперт С++
342 / 306 / 36
Регистрация: 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/... 288e656b24
1
Freelance
Эксперт С++
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
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);
1
13 / 8 / 3
Регистрация: 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/... 288e656b24
спасибо за помощь, но вот клас вектор для меня вообще темный лес, и боюсь если залезу то долго вылезать буду, а мне работу надо до сентября месяца здать. Так что лучше примерчик с int массивами написал бы, и все равно спасибо.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
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 количество столбцов. Главное- скопировать нужным образом, я говорил уже. А как копировать я ума не приложу, чё у тебя за алгоритм.
1
13 / 8 / 3
Регистрация: 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'..."
0
Freelance
Эксперт С++
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
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;
1
13 / 8 / 3
Регистрация: 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;
Спасибо уже получилось. А зачем его потом удалять? Если он мне нужен будет все время им же можно будет пользоваться как обычным массивом или он только временным может быть?
0
Freelance
Эксперт С++
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
22.07.2011, 01:02 11
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
Если он мне нужен будет все время им же можно будет пользоваться как обычным массивом
Да.
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
или он только временным может быть?
Когда он вам станет не нужен, тогда и удалите память, я так понимаю в вашей ситуации -- в конце программы.
1
13 / 8 / 3
Регистрация: 07.01.2011
Сообщений: 149
22.07.2011, 01:05  [ТС] 12
Когда он вам станет не нужен, тогда и удалите память, я так понимаю в вашей ситуации -- в конце программы.[/QUOTE]

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

Добавлено через 11 минут
Например: если работать с указателями, то адрес pArray+1 будет в соседнем байте с pArray так?
0
Freelance
Эксперт С++
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
22.07.2011, 01:48 15
Думаю так будет понятно: pArry[i][j] <=> *(*(pArray + i) + j)

Добавлено через 41 секунду
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
ну в обычном массиве адреса элементов распологаются подрят, а в этом случае так же?
Это и есть обычный масив, только память мы под него выделили динамически.
0
Программист
119 / 97 / 11
Регистрация: 22.03.2011
Сообщений: 244
22.07.2011, 01:50 16
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
ну в обычном массиве адреса элементов распологаются подрят, а в этом случае так же? Или тут подрят идут адреса только строк, а столбцов уже могут распологаться в другом месте, или все идет подрят как в обычном массиве?
Да, вы совершенно правы. Работа с массивами и указателями на массив ведется идентично - единственное, что надо иметь ввиду - это передача в функции, если вы передаете функции, ожидающей, скажем, например? int** int[5][5], то в данном случае требуется явное преобразование - либо прототип функции описывать явно.
0
13 / 8 / 3
Регистрация: 07.01.2011
Сообщений: 149
22.07.2011, 02:13  [ТС] 17
Всем спасибо, разобрался, все получилось!
0
2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 19
22.07.2011, 14:14 18
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
Спасибо уже получилось. А зачем его потом удалять? Если он мне нужен будет все время им же можно будет пользоваться как обычным массивом или он только временным может быть?
Затем, что здесь создается динамический массив, а 6 - это его максимальный размер. После использования динамической памяти, её надо очистить с помощью delete.
Сомневаюсь что массив тебе будет нужен после окончания работы программы.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
22.07.2011, 15:39 19
По окончании работы динамический массив удалится сам. Но всё равно нужно приучать себя удалять принудительно. Потом это умение и привычка воздастся сторицей.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
22.07.2011, 19:20 20
Цитата Сообщение от kravam Посмотреть сообщение
По окончании работы динамический массив удалится сам
вы со своим классом матрицы не перепутали случайно?
0
22.07.2011, 19:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.07.2011, 19:20
Помогаю со студенческими работами здесь

Проверьте пожалуйста указатели , размерность ответа не влазит что изменить
Содержание работы: 1. Разработать Си - программу содержащую 6 переменных одного типа и 2...

Размер vs. размерность матрицы
Вопрос скорее теоретический. Чем отличается размер матрицы от размерности? И как правильно...

Размерность матрицы в файле
Здраствуйте, вот у меня кусок кода в котором я открываю файл и записываю в матрицу q на w! Хотел...

Считать из файла размерность матрицы
Необходимо считать из файла размерность. Саму матрицу считываю, но сказали, что нужно, чтобы была...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru