定义一个等于1x1矩阵的实数标量

时间:2015-08-25 17:11:58

标签: fortran

令A和B分别为大小1倍n和n乘以1的矩阵。 然后A与B的乘法是1乘1矩阵。

哪种方法可以将MATMUL(A,B)的值分配给实数x

我想写:

x=MATMUL(A,B)  ! <<--- but this is wrong.

上述表达式错误,因为我试图将1倍1矩阵分配给实数。

我的解决方案是定义1倍1矩阵C并使用:

C=MATMUL(A,B)
x=C(1,1)         ! <--- this solution is ok, but is too long

但是,有一种更好的方法可以将MATMUL(A,B)分配给实数x吗?

我的问题的整个代码如下:

PROGRAM testing
  !
  IMPLICIT NONE
  REAL :: A(1,2),B(2,1),C(1,1),x
  !
  A(1,1)=1.0; A(1,2)=3.5
  B(1,1)=2.0; B(2,1)=5.0
  C=MATMUL(A,B)               ! it is ok
  x=MATMUL(A,B)               ! it is wrong
  x=C(1,1)                    ! it is ok     <--- exists a better way ??
  !
END PROGRAM testing

2 个答案:

答案 0 :(得分:4)

您已经注意到,无法对数组进行内部数组赋值(@SessionScoped是一个大小为1的rank-2数组)。 C是从x=C(1,1)的单个元素到标量C进行此类分配的正确方法。

还有其他方法可以抽象出正确的赋值语句,但这样做可能没什么价值。

但是,在您的具体情况下,还有其他选择。而不是x,请考虑matmul

dot_product

答案 1 :(得分:1)

根据我的评论,您可以编写一个非常简单的函数来提取数组的第一个元素:

real function first(matrix) !return the (1,1,1,..) element of an array
real, intent(in) :: matrix(*)
first=matrix(1)
end function

只需使用:

real :: a(1,2),b(2,1),x
...
x=first(matmul(a,b))

请注意,如果您想确保仅用于dimension(1,1)数组,则需要使用显式接口并执行以下操作:

real function first(matrix)
real, intent(in) :: matrix(:,:)
if(.not.all(shape(matrix).eq.[1,1]))reporterror()
first=matrix(1,1)
end function