【发布时间】:2011-06-11 02:09:19
【问题描述】:
我是 C 的完全菜鸟(float 条目。
第一种天真的方法是使用数组数组,例如
float naifMatrix[3][3] = {
{2, 1, 3},
{0, -1, 4},
{1, 3, 0}
};
问题是你不能在不知道先验维度的情况下将这样的对象作为参数传递(当然我希望能够使用任意大小的矩阵,这在编译时是未知的)。在使用向量并将它们表示为数组时,人们看不到这个问题。如果我这样做了
float vector[3] = {1, 2, 3};
norm(vector);
只要我声明 norm 喜欢,它就会起作用
norm(float * vector);
当vector被传递时,它被转换为&vector[0],并且不会丢失太多信息(基本上必须跟踪长度)。但我不能只是打电话
gaussReduction(naifMatrix);
并声明gaussReduction
gaussReduction(float ** naifMatrix);
因为naifMatrix 被转换(并且正确地如此)为指向浮点数组的指针,而不是指向指针的指针。由于我不知道这个数组会有多大,所以我看不到声明 gaussReduction 的方法。
当然,我可以通过传递一个指向 void 的指针来作弊,但在取消引用它之前,我需要将它转换为正确的类型 (float[3] *),这也是我不知道先验的。此外,在我看来,滥用 void * 会破坏使用 C 而非其他语言的目的之一,即严格的类型检查。
到目前为止,我发现的最佳解决方案是使用结构。矩阵基本上由其条目列表和两个维度给出。所以我可以做
struct matrix {
float * begin;
int rows, columns;
};
并将其用作
struct matrix matrix = {&naifMatrix[0], 3, 3};
问题是这仍然很烦人。首先,从双精度数组中获取struct matrix 是不公平的,第二个必须明确给出尺寸。我很乐意用一种“构造函数”函数来包装它,比如
struct matrix matrix = Matrix(naifMatrix);
但我不能这样做有两个原因。首先,在将naifMatrix 作为参数传递给函数时,我遇到了与上述相同的问题。其次,即使我可以通过它,我也会得到一个指针,因此我无法获得有关维度的信息(在这种情况下,两者都是 3)。
有没有更明智的方法来传递和操作矩阵的数据?
【问题讨论】:
-
我建议您购买一份C 中的数字食谱 并阅读。你会在那里学到你需要的一切,以及更多。
-
@David:谢谢,但这不仅仅是我想做的。 :-) 我只是在玩学C,我不期待建立一个线性代数库。
-
stackoverflow.com/questions/16004668/… 在上面你会发现一个程序,我用任何可能的方式为 C (gcc C11/C99) 分配和操作矩阵的函数。也许4u会有用...