首页 > 解决方案 > 关于 fortran 函数 MATMUL() 行为的问题

问题描述

我是 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

结果我期望这个矩阵:

乙 =
| 3 3 | , 2x2 矩阵
| 3 3 |

相反,我收到此错误消息:

matmlt.f90(9):错误 #6366:数组表达式的形状不符合。[B] b = MATMUL(a,TRANSPOSE(a)) ------^

为了使这段代码正常工作,我必须像这样切换 MATMUL 参数:

b = MATMUL(转置(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 |

我的代码有什么问题?

谢谢你。

标签: matrixfortran

解决方案


您对变量的矩阵定义

     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)) ------^

错误


推荐阅读