読者です 読者をやめる 読者になる 読者になる

転置行列のコード

他の方のブログを見て知った。
転置行列は、Schemeで短く書ける。

(define (transposed-mat A)
  (apply map list A))

ちなみに以前、
作成日記 Schemeで数値計算(1) - nibosiiwasi’s blog
で私が書いた転置行列のコードはこれ↓。長いだけだな。

;;行列を、1列目とその他に分ける
(define (col1sep-mat A)
  (define (col1sep-mat-pre  A tmp1 tmp2)
    (if (null? A)
	(cons tmp1 tmp2)
	(col1sep-mat-pre (cdr A)
				(append tmp1 (list (list (caar A))))
				(append tmp2 (list (cdr (car A)))))))
  (col1sep-mat-pre A '() '() ))

;;1列を1行に変換
(define (col2line col)
  (define (col2line-p col tmp)
    (if (null? col)
	tmp
	(col2line-p (cdr col)
		    (append tmp (list (caar col))))))
  (col2line-p col '() ))

(define (transposed-mat A)
  (define (transposed-mat-p A tmp)
    (if (null? (car A))
	tmp
	(transposed-mat-p (cdr (col1sep-mat A))
			  (append tmp
				  (list (col2line (car (col1sep-mat A))))))))
  (transposed-mat-p A '() ))