• ベストアンサー

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% (2127/6289)
回答No.1

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

red_devils
質問者

お礼

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