我是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)
答案 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.m4和matmull.m4中学习libgfortran实现。有两个版本,因为第一个版本为大型矩阵调用优化的BLAS库,而另一个版本为较小的矩阵调用自己的实现。