在C中表示单元格数组(来自MATLAB)

时间:2012-02-24 07:27:31

标签: c matlab pointers

问题:如何在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对象,并想知道它是否会成为性能瓶颈,因为这些单元格真的很大并经常访问。

如何更好地设计此界面?

谢谢。

1 个答案:

答案 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,免费的文件操作是真正的瓶颈,但唯一可以确定的方法是分析器。希望这有帮助!