令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
答案 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