Вопрос о поведении фортрана функции MATMUL () - PullRequest
0 голосов
/ 17 июня 2020

Я новичок ie в fortran, и мне нужно умножать матрицы разных форм с помощью MATMUL (), и результат не тот, который я ожидал ...

Вот мой код fortran:

  integer, dimension(3,2) :: a
  integer, dimension(2,2) :: b
  integer :: i, j

  a = reshape((/ 1, 1, 1, 1, 1, 1 /), shape(a))

  b = MATMUL(a,TRANSPOSE(a))

  do j = 1, 2
     do i = 1, 2
        print*, b(i, j)
     end do
  end do

Я ожидал такой матрицы в результате:

b =
| 3 3 | , матрица 2x2
| 3 3 |

Вместо этого я получил это сообщение об ошибке:

matmlt.f90 (9): error # 6366: формы выражений массива не соответствуют. [B] b = MATMUL (a, TRANSPOSE (a)) ------ ^

Чтобы этот код работал правильно, мне пришлось переключить аргументы MATMUL следующим образом:

b = MATMUL (TRANSPOSE (a), a)

Таким образом, я получил то, что ожидал вначале. Но это не интуитивно.

На бумаге

a =
| 1 1 1 |
| 1 1 1 |

транспонирование (a) =
| 1 1 |
| 1 1 |
| 1 1 |

транспонирование оси (a) =
| 3 3 |
| 3 3 |

и

транспонирование (a) xa =
| 2 2 2 |
| 2 2 2 |
| 2 2 2 |

Что не так с моим кодом?

Спасибо.

1 Ответ

2 голосов
/ 18 июня 2020

определение вашей матрицы для переменной

     integer, dimension(3,2) :: a 

означает, что у вас есть 3 строки и 2 столбца (в зависимости от вашего предположения). Впоследствии

a =
| 11 |
| 11 |
| 11 |

и

транспонировать (a) =
| 111 |
| 111 |

matmul (a, транспонировать (a)) =
| 2 2 2 |
| 2 2 2 |
| 2 2 2 |

, поэтому ваша переменная b должна быть определена как

 integer, dimension (3,3) :: b 

вместо

 integer, dimension (2,2) :: b  

, что является причиной

matmlt. f90 (9): ошибка # 6366: формы выражений массива не соответствуют. [B] b = MATMUL (a, TRANSPOSE (a)) ------ ^

Ошибка

...