• ベストアンサー

C言語における対称行列の作り方は?

「0」「1」のみの数値を用いてC言語で対称行列を作成したいのですが、アルゴリズムを知っている方がいたら教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.3

なるほど、そういう意味でしたか^^ C99だと可変の配列サイズを渡せるのでしたよね? だから、10に固定にせずに変数で渡すほうがいいのでは? ==== #include <stdlib.h> int setsym(int n, int t[n][n]) { int i, j; for (i = 0; i < n; ++i) { t[i][i] = 0; for (j = 0; j < i; ++j) if ((float)rand() / RAND_MAX <= 0.2) t[i][j] = t[j][i] = 0; else t[i][j] = t[j][i] = 1; } } int main(void) { int a[10][10]; setsym(10, a); }

red_devils
質問者

お礼

なるほど。そうすればいいのですね!色々とありがとうございました^^

その他の回答 (2)

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.2

質問の意味がもう一つはっきりしませんが、ある次元の配列で、 値が0または1である対称な行列をすべて作りたいというのなら、 たとえば、以下のようにすればいいのではないですか? 対称だというのだから、ほんとは、N*(N+1)/2個の要素しか必要なくて、 N*(N+1)/2 個の要素に 0 か 1 を設定すれば、それで終わりなのですが。。 ====3x3の行列 #include <stdio.h> #define N 3 void print(int a[][N]) { int i, j; for (i = 0; i < N; ++i) { for (j = 0; j < N; ++j) printf("%d ", a[i][j]); putchar('\n'); } printf("---------------\n"); } void assign(int a[][N]) { int i, j; for (i = 0; i < N; ++i) for (j = i + 1; j < N; ++j) a[j][i] = a[i][j]; } void set(int i, int j, int a[][N]) { if (i == N - 1 && j == N - 1) { a[i][j] = 0; assign(a); print(a); a[i][j] = 1; assign(a); print(a); } else { int ii, jj; if (j < N - 1) { ii = i; jj = j + 1; } else { ii = i + 1; jj = ii; } a[i][j] = 0; set(ii, jj, a); a[i][j] = 1; set(ii, jj, a); } } int main(void) { int a[N][N]; set(0, 0, a); }

red_devils
質問者

お礼

お答えありがとうございました。参考にさせていただいて以下のように作成しました。アドバイスありがとうございました。 int (int T[10][10]){ int x,i,j,count=1; float r; for(i=0;i<10;i++) { for(j=0;j<count;j++) { r = ((float)rand() / 32768.0); if(i==j) T[i][j] = 0; else { if(r <= 0.2) { T[i][j] = 1; T[j][i] = 1; } else { T[i][j] = 0; T[j][i] = 0; } } } count++; }

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

正方行列 a[n][n] において、 a[i][j] と a[j][i] とが等しくなるようにしてください。

red_devils
質問者

お礼

お答えありがとうございました。a[i][j] と a[j][i]を同じにすることは分かっていたのですが、ループのまわし方が分からなかったのです。

関連するQ&A

  • 対称行列同士の積は対称行列?

    対称行列Aと対称行列Bをかけたとします。 A(対称行列)×B(対称行列)=C その解Cは必ず対称行列になるのでしょうか? それとも、成らないのでしょうか?

  • 【C言語】行列のランク(階数)の求め方

    閲覧して頂きありがとうございます。 C言語で行列のランク(階数)を求めたいのですが、標準関数には用意されていないみたいなので 自分で関数を作成したいのですが、どう作ればいいのかも困っている状態です。 例えば、値が0と1で構成された4×4の行列の場合の ランクを求めるにはどういったアルゴリズムで作成するのでしょうか? ご回答者様の手間にならない範囲でヒントやソースコード、参考サイトなどあれば ご教示お願いできないでしょうか。 漠然とした質問で申し訳ございませんが、よろしくお願いします。

  • 反対称行列の行列式

    例えば、4×4の反対称行列の行列式は | 0 +a +b +c | | -a 0 +d +e | | -b -d 0 +f | | -c -e -f 0 | =(af-be+cd)^2 となります。 一般の2n×2n行列の行列式を求めるにはどのようにしたらよいのでしょうか。 よろしくお願いします。

  • 対称行列について

    対称行列について質問させてください。 対称行列の固有値問題を解くと固有値、固有値ベクトルはどうなるか? また、共分散行列は常に対称行列である理由を教えてください。

  • n✕n行列(非対称)の固有値問題のアルゴリズム

    よろしくおねがいします。 タイトルの通り、 n✕n行列の固有値を求めるプログラムを作成しようと考えています。 ただし、行列は非対称行列とするためJacobi法等は使えません。 そこで、 このプログラムを作成する際の一般的なアルゴリズムを教えていただきたいです。 例えば、どういった法則を使うのか?などです。 具体的であればあるほどありがたいです。 しょぼい質問ですがお願いします。

  • 対称行列への近似

    こんにちは. 自分は多次元の数値解析をしています. その際に固有値,固有ベクトルを使用するのですが,その対象となる行列が対称行列ではない為,固有値が虚数解になってしまうため,後々の計算に不具合が生じてしまいます. そこで,その対象となる行列を対称行列に近似(虚数解を出さないようにする為)しようと思うのですが,なにかよい方法はありませんか? よろしくお願いします.

  • 非正方行列の行列式をC言語で計算したいのですが。

    非正方行列の行列式を求めたいのですがどのような式になるのでしょうか? また、これをC言語で作成しなければなりません。 プログラミングはほぼ初心者なので、回答者様の手間にならない程度で優しく回答していただければと思います。 宜しくお願いします。

  • 対称行列 対角行列

    対角行列と対角化について質問させて頂きます。 対角行列は、対角成分以外が0の正方行列です。 対称行列は、t^A=Aが成り立つ正方行列Aです。 ここで、対称行列の定理で、 ・対称行列の異なる固有値に属する固有ベクトルは直交する。 というものがあるのですが、これは対角行列にも言えるのでしょうか? 対角行列は対称行列なので言えると思いますが、 テキストに特に記載がなかったので質問させて頂きました。 以上、ご回答よろしくお願い致します。

  • 歪対称行列

    3*3の歪対称行列を今日学校で教えてもらったのですが、detが0でない2*2の歪対称行列も存在すると言われ、それが分かりません。結局答えも教えてもらえず気になって仕方ありません。 できれば具体例を教えてください。 お願いします。

  • C言語で行列の演算するには?

    C言語で行列を取り扱うにはどうしたらいいのですか? 二次元配列というのは行列の演算のことなのですか? 初心者なのでよく分からないのでなるべく丁寧に教えてもらえるとうれしいのですが。よろしくお願いします。

専門家に質問してみよう