Вопрос: Как создать лучший интерфейс между массивами ячеек и независимыми объектами 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, и задаться вопросом, будет ли это узким местом производительности, поскольку эти ячейки действительно большие и часто доступны.
Как я могу лучше спроектировать этот интерфейс?
спасибо.
Хорошо, я решил, что смогу создавать эти независимые объекты матрицы статически и выделять память для элементов данных во время выполнения. Тогда я могу добиться единообразия в интерфейсе. Я также ищу другие ответы. спасибо. – mod0