fork download
  1. /*
  2.   C/C++の宿題片付けます 161代目
  3.   http://t...content-available-to-author-only...h.net/test/read.cgi/tech/1354070278/
  4.   386 名前:デフォルトの名無しさん [aa]: 2012/12/17(月) 18:24:30.48
  5.   二つの2×3型行列を
  6.   A=1.1 -2.2 0.9
  7.   -0.2  2.7 0.3
  8.   B= 1.8 0.5 1.3
  9.   -0.4 0.6 -0.3
  10.   と定義する。
  11.  
  12.   387 名前:デフォルトの名無しさん [sd]: 2012/12/17(月) 18:26:36.33
  13.   これらの二つの行列の宣言、初期化し、C≡A+B C≡A-Bを算出して
  14.   2×3型の表形式で出力するプログラムを作成せよ。ただし、行列CとDは固定長
  15.   配列とし、関数内の演算を行うこと
  16.  
  17.   上記の問題と同じように行列A、Bを用いて、積C≡ABt を算出し、2×2型の表
  18.   形式で出力せよ。ただし、Bの転置行列、Btはプログラム中に直接記述するのでは
  19.   なく、Bより作成すること。また、Cはnew演算子によりメモリを確保し、関数内で
  20.   演算を行うこと。
  21.  */
  22. #include <stdio.h>
  23.  
  24. #define MM (2)
  25. #define NN (3)
  26.  
  27. /* M×N列 表示 */
  28. void m_print_MN(double mx[MM][NN])
  29. {
  30. int i, j;
  31. for (i = 0; i < MM; i++) {
  32. printf(" | ");
  33. for (j = 0; j < NN; j++) {
  34. printf("%f ", mx[i][j]);
  35. }
  36. printf("|\n");
  37. }
  38. }
  39.  
  40. /* pointer行列 表示 */
  41. void m_print_ptr(double **mx, int m, int n)
  42. {
  43. int i, j;
  44. for (i = 0; i < m; i++) {
  45. printf(" | ");
  46. for (j = 0; j < n; j++) {
  47. printf("%f ", mx[i][j]);
  48. }
  49. printf("|\n");
  50. }
  51. }
  52.  
  53. /* 行列確保(new) */
  54. double **m_alloc(int m, int n)
  55. {
  56. int i;
  57. double **pma;
  58. pma = new double *[m];
  59. pma[0] = new double[m * n];
  60. for (i = 1; i < m; i++) {
  61. pma[i] = pma[0] + n * i;
  62. }
  63. return pma;
  64. }
  65.  
  66. /* 行列解放(delete) */
  67. void m_free(double **pma)
  68. {
  69. delete[]pma[0];
  70. delete[]pma;
  71. }
  72.  
  73. /* 加算 */
  74. double **m_add(double s1[MM][NN], double s2[MM][NN])
  75. {
  76. int i, j;
  77. double **dst;
  78. dst = m_alloc(MM, NN);
  79. for (i = 0; i < MM; i++) {
  80. for (j = 0; j < NN; j++) {
  81. dst[i][j] = s1[i][j] + s2[i][j];
  82. }
  83. }
  84. return dst;
  85. }
  86.  
  87. /* 減算 */
  88. double **m_sub(double s1[MM][NN], double s2[MM][NN])
  89. {
  90. int i, j;
  91. double **dst;
  92. dst = m_alloc(MM, NN);
  93. for (i = 0; i < MM; i++) {
  94. for (j = 0; j < NN; j++) {
  95. dst[i][j] = s1[i][j] - s2[i][j];
  96. }
  97. }
  98. return dst;
  99. }
  100.  
  101. /* 転置乗算 */
  102. double **m_mul_Bt(double ma[MM][NN], double mb[MM][NN])
  103. {
  104. int i, j, k;
  105. double **bt = m_alloc(NN, MM);
  106. double **dst = m_alloc(MM, MM);
  107. // Bt
  108. printf("Bt =\n");
  109. for (i = 0; i < MM; i++) {
  110. for (j = 0; j < NN; j++) {
  111. bt[j][i] = mb[i][j];
  112. }
  113. }
  114. m_print_ptr(bt, NN, MM);
  115. // mul
  116. for (i = 0; i < MM; i++) {
  117. for (j = 0; j < MM; j++) {
  118. dst[i][j] = 0.0;
  119. for (k = 0; k < NN; k++) {
  120. dst[i][j] += ma[i][k] * bt[k][j];
  121. }
  122. }
  123. }
  124. // end
  125. m_free(bt);
  126. return dst;
  127. }
  128.  
  129. /* */
  130. int main()
  131. {
  132. int i;
  133.  
  134. double mA[MM][NN] = {
  135. {1.1, -2.2, 0.9},
  136. {-0.2, 2.7, 0.3}
  137. };
  138. double mB[MM][NN] = {
  139. {1.8, 0.5, 1.3},
  140. {-0.4, 0.6, -0.3}
  141. };
  142. double **mAB_add, **mAB_sub;
  143. double **mABt_mul;
  144.  
  145. // A, B
  146. printf("A =\n");
  147. m_print_MN(mA);
  148. printf("B =\n");
  149. m_print_MN(mB);
  150. // A + B
  151. mAB_add = m_add(mA, mB);
  152. printf("A + B =\n");
  153. m_print_ptr(mAB_add, MM, NN);
  154. // A - B
  155. mAB_sub = m_sub(mA, mB);
  156. printf("A - B =\n");
  157. m_print_ptr(mAB_sub, MM, NN);
  158. // A × Bt
  159. mABt_mul = m_mul_Bt(mA, mB);
  160. printf("A × Bt =\n");
  161. m_print_ptr(mABt_mul, MM, MM);
  162.  
  163. // end
  164. m_free(mABt_mul);
  165. m_free(mAB_sub);
  166. m_free(mAB_add);
  167. return 0;
  168. }
  169.  
Success #stdin #stdout 0.01s 2856KB
stdin
Standard input is empty
stdout
A =
  | 1.100000 -2.200000 0.900000 |
  | -0.200000 2.700000 0.300000 |
B =
  | 1.800000 0.500000 1.300000 |
  | -0.400000 0.600000 -0.300000 |
A + B =
  | 2.900000 -1.700000 2.200000 |
  | -0.600000 3.300000 0.000000 |
A - B =
  | -0.700000 -2.700000 -0.400000 |
  | 0.200000 2.100000 0.600000 |
Bt =
  | 1.800000 -0.400000 |
  | 0.500000 0.600000 |
  | 1.300000 -0.300000 |
A × Bt =
  | 2.050000 -2.030000 |
  | 1.380000 1.610000 |