2011-03-18 3 views
4

Я прочитал несколько сообщений о динамических растущих массивах в C, но я не вижу, как создать 2D растущий массив (например, в MATLAB).C++ 2D растущий массив, как MATLAB

У меня есть функция для построения массива для некоторой обработки изображений, но я не знаю, каков будет размер этого массива (cols и rows). Как я могу создать это?

Я прочитал кое-что о malloc и realloc. Эти функции переносимы или полезны для этой проблемы.

EDIT: SOLVED, используя библиотеку линейных алгебр C++ Armadillo library.

+0

Ищите библиотеку, предназначенную для матричного анализа. C++ - гораздо более общая цель, и ничего подобного не включено в стандартную библиотеку. –

+0

+1 для решения armadillo – nkint

ответ

0

Простейшее это с указателями

int nrows = 10; 
int ncols = 5; 

double* matrix = new double[mrows*ncols]; 

И тогда вы можете получить доступ, как если бы это 2D массив like.

Так что, если вы хотите matrix[row][col], вы могли бы сделать

int offset = row*ncols+col; 
double value = matrix[offset]; 

Кроме того, если вы хотите, комфорт Matlab как матрицы в C++, загляните в Armadillo

+1

Он ищет решение с динамическим изменением размера. – pmr

+0

Я думал, что его «динамический» создавал 2D-массив неизвестного размера во время компиляции? Я думаю, что просто неправильно понял. Несмотря на это, Армадилло, вероятно, то, что он ищет. Он разработан как матричная библиотека matlab-esq для C++. – Chris

+0

Я использую armadillo, но я не могу изменить размер переменной arma :: mat. Я использую метод reshape, но это может изменить размер строк только в том случае, если я попытаюсь изменить размер cols. У меня есть ошибка: «run- временная ошибка: Mat :: operator(): вне границ ".. – matiasfh

1

Если вы занимаетесь обработкой изображений, вы можете использовать matrix и типы массивов от opencv.

0

Выращивая массив как Matlab, я предполагаю, вы имеете в виду делать такие вещи, как:

mat = [mat; col] 

вы можете изменить размер матрицы в C++, но не с чистого синтаксиса как один из приведенных выше.

Например, вы можете использовать std::vector<std::vector<T>> для представления вашей матрицы.

std::vector<std::vector<int> > mat; 

Затем, чтобы добавить столбец:

for (int i=0; i<mat.size(); i++) mat[i].push_back(col[i]); 

или добавить строку

mat.push_back(row); // row is a std::vector<int> 
0

С ++ не имеют стандартный класс матрицы в-се. Я думаю, что было слишком много разных применений такого класса, что делало одно решение для любого размера невозможным. В книге Страуструпа есть пример и обсуждение (The C++ Programming Language (Третье издание)) относительно простой реализации для числовой матрицы.

Однако для обработки изображений гораздо лучше использовать существующую библиотеку.

Возможно, вы посмотрите на CImg. Я использовал его раньше и нашел его быстрым и хорошо документированным.

Если вы находитесь на машине AMD, я знаю, что есть оптимизированная библиотека для обработки изображений от AMD, проект Framewave Framewave Project.

Кроме того, если вы привыкли к коду стиля MATLAB, вы можете посмотреть it++. Я думаю, что цель проекта в том, чтобы он был максимально похож на MATLAB.

0

+1 для OpenCV, особенно полезно, если вы выполняете анализ изображения, поскольку он абстрагирует базовый тип данных (GRAYSCALE, RGB и т. Д.).

Смежные вопросы