2012-02-24 3 views
1

Вопрос: Как создать лучший интерфейс между массивами ячеек и независимыми объектами Matrix?Представление массивов ячеек (от MATLAB) в C

Я преобразовываю код MATLAB, который использует массивы ячеек и массивы ячеек массивов ячеек C. Я создал тип данных Matrix и тип данных Cell. Они проиллюстрированы ниже.

Матрица Тип данных

typedef struct{ 
    double * array; // row major format 
    int rows; 
    int cols; 
} Matrix; 

и сотовый тип данных

typedef struct{ 
    Matrix * array; // row major format 
    int rows; 
    int cols; 
} Cell; 

К счастью, массив ячеек клеточных массивов в коде простой одномерный массив ячеек, которые можно представлять как массив объектов ячейки.

В исходном коде в выражениях содержатся независимые объекты матрицы и элементы массива ячеек (другая матрица). Например:

a = rand(10); 
% say, b is a cell array containing other matrices 
% c = some expression involving an element of the cell array b and a 
c = a + b{1,2}; 
% assuming dimensions agree 

Теперь, в моем представлении, когда я создаю объект ячейки, я выделенные строки * смещ_по_столбцам матричных объектов и присваивается указатель на массив матричных объектов в массив (внутри клетки). Предположим, что объекты Matrix соответствующим образом инициализируются позже в коде (до их использования)

Доступ к независимым объектам матрицы, которые я распределяю динамически, осуществляется с помощью указателей перенаправления, указывающих на них, а процедуры доступа для массивов ячеек возвращают объекты матрицы вместо указатель на объект Matrix.

// Function signature for accessor routine of cell object 
Matrix get_mat_from_cell(Cell * cell, int row, int col); 

// Independent Matrix object - dynamically allocated as size is known 
// at run-time 
Matrix * matrixA = (Matrix *) malloc(sizeof(Matrix)); 

Matrix matrixB = get_mat_from_cell(someCell, 1, 2); 

add(matrixA, &matrixB, matrixC); // adds matrixA, matrixB and stores in a matrixC 

Дело в том, что щекочет меня в функции добавления (например), чтобы получить единый интерфейс, который принимает указатели матриц для всех 3-х аргументов, я должен передать адрес matrixB. Он либо выглядит однородным на уровне интерфейса функции - например, add (Matrix *, Matrix *, Matrix *) или равномерным на уровне вызова функции - добавляет (Matrix *, Matrix, Matrix *), а не в обоих направлениях.

Я мог бы достичь единообразия, объявив массив внутри объекта Cell как двойной указатель, но мне нужно удалить ссылку дважды, прежде чем я смогу добраться до объекта Matrix, и задаться вопросом, будет ли это узким местом производительности, поскольку эти ячейки действительно большие и часто доступны.

Как я могу лучше спроектировать этот интерфейс?

спасибо.

+0

Хорошо, я решил, что смогу создавать эти независимые объекты матрицы статически и выделять память для элементов данных во время выполнения. Тогда я могу добиться единообразия в интерфейсе. Я также ищу другие ответы. спасибо. – mod0

ответ

2

Похоже, вы уже это выяснили, но я все равно попробую протянуть руку. Во-первых, я думаю, что ваша Cell структура нуждается в твик, если вы не знаете, что реализация у вас есть очень специфична

/* small set of types as example */ 
typedef union matlab_fundamental_types_u 
{ 
    CELL, 
    MATRIX 
} matlab_fundamental_types_t; 

typedef struct Cell_s 
{ 
    struct Cell_s * array; // row major format 
    matlab_fundamental_types_t fundamental_type; /* what this cell holds, is it a cell of cells, arrays, etc? */ 
    int rows; 
    int cols; 
} Cell; 

Поскольку Cell супер контейнер и может содержать что угодно, в том числе Cell, это имеет смысл для его реализации таким образом, хотя я думаю, что он все еще может использовать какой-то лак. Кроме того, вы упомянули о том, что проблема разыменования двойных указателей является узким местом. Я не думаю, что буду беспокоиться об этом. Мой опыт заключается в том, что malloc, free, файловые операции являются настоящим узким местом, но единственный способ узнать наверняка - это профилировщик. Надеюсь это поможет!

+0

Спасибо. Мне нравится ваш ответ, но я пока не могу продвинуться. Я собираюсь продолжить свой проект и закончить его. Но я вернусь к коду позже и реализую структуру ячеек так, как вы ее положили. – mod0

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