问题:如何在Cell数组和独立的Matrix对象之间设计更好的接口?
我正在将使用单元格数组和单元格数组的MATLAB代码转换为C.我创建了一个Matrix数据类型和一个Cell数据类型。它们如下图所示。
Matrix数据类型
typedef struct{
double * array; // row major format
int rows;
int cols;
} Matrix;
和Cell数据类型
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对象的行* cols,并将指向Matrix对象数组的指针分配给数组(单元格内部)。假设Matrix对象稍后在代码中进行了适当的初始化(在使用它们之前)
我动态分配的独立矩阵对象通过取消引用指向它们的指针来访问,而单元格数组的访问器例程返回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
让我感到困惑的是在add函数中(例如),为了获得一个接受指向所有3个参数的矩阵指针的统一接口,我必须传递matrixB的地址。它在函数接口级别看起来是统一的 - 比如在函数调用级别添加(Matrix *,Matrix *,Matrix *)或统一 - 添加(Matrix *,Matrix,Matrix *)而不是两种方式。
我可以通过将Cell对象中的数组声明为双指针来实现均匀性,但是我必须先取消引用两次才能到达Matrix对象,并想知道它是否会成为性能瓶颈,因为这些单元格真的很大并经常访问。
如何更好地设计此界面?
谢谢。
答案 0 :(得分: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,免费的文件操作是真正的瓶颈,但唯一可以确定的方法是分析器。希望这有帮助!