私は Delphi でいくつかの行列ルーチンを書いていますが、この問題が発生しました。このように実数行列を定義しました:-
RealArrayNPbyNP = 拡張の配列[1..200,1..200];
この配列に 5 x 6 のマトリックスを入力しました。
Delphi コードで行数 (この場合は 5) と列数 (この場合は 6) を取得するために配列をクエリするにはどうすればよいですか。
マトリックスを 200 x 200 と宣言しました。どれだけ使用しても、マトリックスは常に 200 x 200 です。5 x 6 の範囲外のすべてのフィールドには、有用かどうかに関係なく、少なくともいくつかのデータが含まれています。
おそらく、動的配列の使用を検討する必要があります。
var
arr: array of array of Extended
これにより、Setlength を使用して配列の次元をニーズに合わせることができます。5x6 行列を取得するには、次のコードを使用できます(ヒントを提供してくれた Rob に感謝します)。
SetLength(arr, 5, 6);
ご覧のとおり、実際の寸法は Length 関数で照会できます。Length(arr) は最初の次元を取得し、Length(arr[I) は 2 番目の次元を取得します。
この構成では、行列の各「行」に独立した数の「列」を含めることができます。
動的配列が必要なく、有効な値を構成する値に関する追加情報がない場合 (つまり、それらを検索/カウントできない場合)、本質的に追加情報が必要になります。つまり、さらに 2 つの変数が必要にNRows
なりNColumns
、配列にデータを入力するときに設定します。
私があなたの問題を正しく理解していれば、あなたがしようとしているのは、事前に割り当てられた配列を持つことです。これは、部分的にしか埋めておらず、どれだけ埋められているかを判断したいと考えています。
この「配列」を処理するためのすべてのロジックを含むクラスを作成し、次のロジックを含む配列のプロパティ セッターを記述します。
Procedure SetArrayValue(X,Y:Extended);
begin
fInternalArray[x,y] := Extended;
fInternalArrayMaxX := Max(fInternalArrayMaxX,X);
fInternalArrayMaxY := Max(fInternalArrayMaxY,Y);
end;
そして、次のような配列の初期化/クリア関数:
Procedure ClearArray;
begin
FillMemory(@fInternalArray,SizeOf(fInternalArray),0);
fInternalArrayMaxX := 0;
fInternalArrayMaxY := 0;
end;
ブール値の境界に一致する別の配列を追加し、それを適切に変更することにより、配列要素に値があるかどうかの決定を拡張することもできます。
行列が最初に既知の値 (0 や無効な値など) で入力されていることを保証できる場合はstrlen()
、フラグ値の前に存在する最初の行と列の要素の数を単純に数えることができます。ただし、これは非効率的である傾向があります。必要に応じて現在のサイズを渡すことができないのはなぜですか? または、マトリックス機能を適切なオブジェクトにカプセル化することをお勧めします。