私はC(< 1週間)の完全なnoobです。私は他の言語でのプログラミングに精通していますが、私はそれに取り組む方法を理解しようとしています。最初の目標として、私はマトリックス上でガウス減少を行う関数を書こうと思っていました。アルゴリズムに問題はありませんが、行列を表現する方法はわかりません。わかりやすくするため、float
のエントリを使用しているとします。マトリックスの構造
最初NAIFの方法は、アプリオリ(もちろん私はなりたい寸法を知らなくても、あなたが引数として、このようなオブジェクトを渡すことができないことを
float naifMatrix[3][3] = {
{2, 1, 3},
{0, -1, 4},
{1, 3, 0}
};
問題であるように、配列の配列を使用することですコンパイル時には知られていない任意のサイズの行列を使用することができます)。ベクトルで作業して配列として表現するときは、この問題は見えません。私は
float vector[3] = {1, 2, 3};
norm(vector);
をすれば、それは私がvector
が渡されると、それは(&vector[0]
に変換され、あまり情報が失われ、基本的には、1つのトラックを保つために持っているnorm
norm(float * vector);
を宣言して、動作します長さの)。しかし、私はちょうど
gaussReduction(naifMatrix);
を呼び出し、naifMatrix
はないポインタへのポインタで、floatの配列へのポインタに変換(と当然のように)され
gaussReduction(float ** naifMatrix);
ためにgaussReduction
を宣言することはできません。このアレイの大きさはわからないので、gaussReduction
を宣言する方法はありません。
もちろん、私は無効にポインターを渡すことで不正行為をすることができますが、逆参照する前に、正しいタイプ(float[3] *
)にキャストする必要があります。これは先験的にわかりません。さらに、私は、void *
を悪用することによって、厳密な型チェックである他の言語よりもCを使用する目的の1つを打ち負かすように思えます。
私が今までに見つけた最良の解決策は、構造体を使用することです。行列は、基本的にそのエントリと2つの次元のリストによって与えられます。だから私は
struct matrix {
float * begin;
int rows, columns;
};
を行うと、
struct matrix matrix = {&naifMatrix[0], 3, 3};
問題としてそれを使用することができ、これはまだ迷惑であるということです。まず、double配列からstruct matrix
を取得するのは大変です.2番目の配列では、次元を明示的に指定する必要があります。
struct matrix matrix = Matrix(naifMatrix);
のような種類の「コンストラクタ」関数でこれをラップするとうれしいですが、私はこれを2つの理由で行うことはできません。まず、関数に引数としてnaifMatrix
を渡す際に、上記と同じ問題があります。第二に、たとえそれを渡すことができたとしても、私はポインタを取得するので、次元に関する情報を得ることができませんでした(この場合、両方とも3です)。
マトリックスのデータムを渡して操作する方が賢明な方法はありますか?
C *で*数値レシピのコピーを購入し、それを読むことをお勧めします。あなたはそこに必要なものすべてを学ぶでしょう。 –
http://stackoverflow.com/questions/4051/passing-multidimensional-arrays-as-function-arguments-in-c related。 – Rozuur
@David:ありがとうございますが、これは私がしたいことだけではありません。私はちょうどCを学ぶために遊んでいる、私は線形代数ライブラリを構築することを楽しみにしていない。 – Andrea