回 帖 发 新 帖 刷新版面

主题:有个重载的问题,很诡异~

real:: a1(1,3)=(/1,2,3/)
 real:: a2(3,3)=0
 matmul(a2,a1)
........
这样编译出错,是必然的嘛 The shapes of the arguments are inconsistent or nonconformable

然后我把 matmul 放在模块函数里:
FUNCTION  mtplm_m(mat1,mat2)
        real,intent(in),dimension(:,:):: mat1,mat2
        real,allocatable,dimension(:,:):: mtplm_m
        integer:: trow1,tcol2
        !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        trow1=ubound(mat1,1)
        tcol2=ubound(mat2,2)
            allocate(mtplm_m(trow1,tcol2))
            mtplm_m = matmul(mat1,mat2)    
ENDFUNCTION mtplm_m

然后运行:  mtplm_m(a2,a1)
竟然可以运行!乘出来是3×3矩阵,这个就不能理解了,一样的matmul内置函数为什么会出现这两种情况?

回复列表 (共6个回复)

沙发

trow1=ubound(mat1,1)
tcol2=ubound(mat2,2)
在计算过程中得到的是什么值? 因为我的矩阵角标都是由1开始的, 所以习惯上使用size函数而不是ubound这类的函数.
我觉得会不会是, real,intent(in),dimension(:,:):: mat1,mat2 这样的假定型传送的时候上下界的信息不足导致的?

要不楼主贴个完整代码我们试试?

板凳

以后用size,学习了~
回到这个问题,我又重新写了个清楚一点的

module mat
contains
    function mtpl(x,y)
    implicit none
        real:: x(:,:),y(:,:)
        real,allocatable:: mtpl(:,:)
        integer:: row_x,col_x,row_y,col_y
        !-----------------------------------
        row_x = ubound(x,1)
        col_x = ubound(x,2)
        row_y = ubound(y,1)
        col_y = ubound(y,2)       !--------(1)------
        allocate(mtpl(row_x,col_y))
        mtpl = matmul(x,y)
    end function mtpl
end module mat
!----------------------------------------------------
program problem
use mat
implicit none
    real:: a(1,3)=(/1,2,3/)
    real:: b(3,2)=reshape((/1,2,3,4,5,6/),(/3,2/))
    write(*,*) mtpl(b,a)          !--------(2)-------
end program problem

几行代码编译能够通过,很不解 3×2的矩阵能乘1×3的矩阵??
(1) 两个矩阵的行和列输出值都没有问题
(2) 最后一行换成matmul(b,a) 就会就出错,是正常的



3 楼

因为编译器不好检查你传入参数的数组大小。所以在编译期是检查不出来的。但如果编译器生成代码做了严格检查的话,你的程序就执行不下去了。

4 楼

谢谢回复
如果我要做重载,这样程序就不能判断我矩阵能不能相乘了,有没有解决方案呢?

5 楼

自己判断:)

6 楼

本来倒是有自己判断的语句的,后来想用编译器来编译能不能通过来判断的,看来现在有得回到自己判断了,谢谢了

我来回复

您尚未登录,请登录后再回复。点此登录或注册