次のように、テスト配列という名前の次元 '(3 3 2) の配列があります。
#3A(((0 0) (0 0.1) (0 0.3))
((1 0) (1 0.1) (1 0.3))
((2 0) (2 0.1) (2 0.3)))
配列内の最も内側のリスト (ランク 2) はポイント座標であることに注意してください。したがって、一般的に配列は次のようになります。
#3A(((x0 y0) (x0 y1) (x0 y2))
((x1 y0) (x1 y1) (x1 y2))
((x2 y0) (x2 y1) (x2 y2)))
この配列内の要素を使用して、新しい配列を作成します。
この配列のすべての行 (配列ランク: 0) で、1 番目の xy 座標から 2 番目の xy 座標を、2 番目の xy 座標から 3 番目の xy 座標を減算します。したがって、基本的にパラメトリック形式で探している結果は次のとおりです。
#3A(((x0-x0 y1-y0) (x0-x0 y2-y1))
((x1-x1 y1-y0) (x1-x1 y2-y1))
((x2-x2 y1-y0) (x2-x2 y2-y1))
初期配列を操作するだけでこれを行う単純な直接関数または操作はありますか?
私はこれに対する直接的な操作を知らないので、最初の配列からリストを作成し:initial-contents
て新しい配列にすることを考えました。したがって、このアプローチの最初の目的は、次の初期コンテンツ リストを取得することです。
(((x0-x0 y1-y0) (x0-x0 y2-y1))
((x1-x1 y1-y0) (x1-x1 y2-y1))
((x2-x2 y1-y0) (x2-x2 y2-y1))
これを行うために、2回使用するコードを考えましたdotimes
(外側のループの数は行の数になり、内側のループの数は列の数になります):
(let ((result-1))
(dotimes (n (array-dimension test-array 0) result-1)
(setq result-1
(append result-1
(let ((result-2))
(dotimes (m (1- (array-dimension test-array 1)) result-2)
(setq result-2
(append result-2
(list (- (aref test-array n (1+ m) 0)
(aref test-array n m 0))
(- (aref test-array n (1+ m) 1)
(aref test-array n m 1)))))))))))
しかし、これには質問のタイトルでもある1つの問題があります。明らかに、この「パラメトリック」な方法 (n & m を使用) に入力を与える方法aref
は、CL では評価されません。(aref test-array n m 0)
なぜそのような問題があるのですか?ループ内で aref を使用する他の方法を考えることができますか、または別のアプローチで :initial-contents リストを作成できますか?
私が持っている実際の初期配列の次元は (21 16 2) であり、すべての xy 座標は互いに異なるため、これは私の実際の質問の比較的単純な形式であることに注意してください。
回答をいただければ幸いです...