質問: ### 前提・実現したいこと c言語で最急降下法を用いて行列の最小値を求めるプログラムを作成したいです。 b=Axとし f(x)=(ax-b)^T*(ax-b)の最小値を最急降下法で求めたいのですが f(x)=(ax-b)^T*(ax-b) f(x)'=2a^T*ax-2a^T*b この二つを再起関数とし答えを求めようとしています。 しかし再起関数の中の転置行列をどのようにc言語で書いたら良いのか分かりません。
回答: どのようなライブラリーを使うのかといったことがわからないのあさっての方向を向いたコメントかも知れませんが・・・ x,yがベクトル(一次元配列)と仮定し、 (A) xyが要素同士を乗算した結果のベクトルを得る演算 (B) x^T*yがxとyのドット積(内積)を得る演算 とするなら数式上転置行列の記号はでてきますがそれを正直に「C言語で転置するにはどうすれば・・・」と考える必要なないと思います。 ``` #define N ... // (A) void multiply(double x[], double y[], result[]) { for (int i = 0; i < N; i++) { result[i] = x[i] * y[i]; } } // (B) double dot_product(double x[], double y[]) { double result = 0; for (int i = 0; i < N; i++) { result += x[i] * y[i]; } return result; } ``` と書けばよいだけの話ではないでしょうか?またx,yが2次元配列にしたとしても同様に「必ずしも正直に転置する必要はない」と言えると思います。計算する際に用いるインデックスの順番に配慮しながら関数を定義すればわざわざ転置する必要はないとも言えます。 しかしながら関数の仕様として「L×Mの行列とM×Nの行列の積を計算してL×Nの行列を返す」といった汎用的に使えるものを考えるなら、その関数の入力にするために転置が必要なこともあるでしょう。 ご質問ではどういう設計にしようとしているか閲覧者に見えてきません。ですのでどうしたらいいかコメントしづらい気がします。