Fortran中的matmul()如何检测数组的维数?

时间:2015-04-08 17:06:03

标签: arrays fortran

我是Fortran的新手。 我试图为矩阵运算编写fortran代码,在那里我被困在设计我的函数的原型(接口)。

我的C / C ++编程经验告诉我,要编写可能适用于所有维度矩阵的代码,需要将数组和维度分别传递给函数。示例(可能不是最好的):

int * matx_op(int *mat_a, int arows, int acols, int *mat_b, int brows, int bcols);

但似乎在fortran matmul()函数中会自动执行此操作。想了解完成的方法。

        print *, 'Enter 16 elements of matrix A'

        do i=1,4
            do j=1,4
                read *, ma(i,j)
            end do
        end do

        print *, 'Enter 16 elements of matrix B'

        do i=1,4
            do j=1,4
                read *, mb(i,j)
            end do
        end do

        mr = matmul(ma,mb)

1 个答案:

答案 0 :(得分:2)

Matmul是一个通用程序。同名是指几种不同的具体程序。你应该从C ++知道这个函数名称重载。这些特定的程序具有不同的类型,种类(又称精度)和参数的等级(又称维度)。

编译器可以访问这些特定函数的接口(" headers")并自动选择正确的函数。

您也可以在Fortran中编写自己的通用程序。

另一个选择是仅对不同类型和种类使用通用过程,并检查过程内部的等级。如果我正确理解了libgfortran matmull.m4中的代码,那就是实际发生的事情。

请注意,Fortran使用各种机制来传递数组参数,而不仅仅是C和C ++中的地址。该过程可以接收数组描述符(aka dope vector)。数组排名及其形状存储在描述符中,可供库函数使用。

请注意源

中的以下内容
if (GFC_DESCRIPTOR_RANK (a) == 1)
{

}
else
{

}

GFC_DESCRIPTOR_RANK()检查数组描述符的相关部分。

您可以在matmul.m4matmull.m4中学习libgfortran实现。有两个版本,因为第一个版本为大型矩阵调用优化的BLAS库,而另一个版本为较小的矩阵调用自己的实现。