回 帖 发 新 帖 刷新版面

主题:请问两个矢量可以直接用乘号相乘吗?

例如
real :: a(4)
real :: b(4)
real :: c(4)
c=a*b
可以c=a*b这样吗? 怎么我翻了签名的那本书和fortran2003 handbook都没看到这个用法, 是cvf或ivf的扩展还是标准?

回复列表 (共20个回复)

沙发

elemental operations and functions P214

板凳

没有这个用法,可以试一试运算符重载
DOT_PRODUCT

Transformational Intrinsic Function (Generic): Performs dot-product multiplication of numeric or logical vectors (rank-one arrays).

Syntax
result = DOT_PRODUCT (vector_a,vector_b)

vector_a
 (Input) Must be a rank-one array of numeric (integer, real, or complex) or logical type. 
 
vector_b
 (Input) Must be a rank-one array of numeric type if vector_a is of numeric type, or of logical type if vector_a is of logical type. It must be the same size as vector_a.
 

Results
The result is a scalar whose type depends on the types of vector_a and vector_b.

If vector_a is of type integer or real, the result value is SUM ( vector_a* vector_b).

If vector_a is of type complex, the result value is SUM (CONJG ( vector_a)* vector_b).

If vector_a is of type logical, the result has the value ANY ( vector_a.AND. vector_b).

If either rank-one array has size zero, the result is zero if the array is of numeric type, and false if the array is of logical type.

Example
DOT_PRODUCT ((/1, 2, 3/), (/3, 4, 5/)) has the value 26, calculated as follows: 
((1 x 3) + (2 x 4) + (3 x 5)) = 26


DOT_PRODUCT ((/ (1.0, 2.0), (2.0, 3.0) /), (/ (1.0, 1.0), (1.0, 4.0) /)) has the value (17.0, 4.0).

DOT_PRODUCT ((/ .TRUE., .FALSE. /), (/ .FALSE., .TRUE. /)) has the value false.

The following shows another example:

  I = DOT_PRODUCT((/1,2,3/), (/4,5,6/)) ! returns                                        !  the value 32

3 楼

我还以为你说矢量点积。。。
这样乘不是很正常吗。。

4 楼

这个用法用得少, 慢慢以为是matlab的特性了, 看到之后觉得是不是被重载了乘号.

近来遇到一个很奇怪的问题, 是关于dot_product, 因为数据需要, 我要计算每一个对应元的乘积, 然后顺手把它们加起来. 这时候发现加起来的和在量级很小的时候(10^-20)跟dot_product不同, 不过还在同一个量级内的不同. 但在量级比较大的时候(10^-3)结果则相同.

5 楼

[quote]近来遇到一个很奇怪的问题, 是关于dot_product, 因为数据需要, 我要计算每一个对应元的乘积, 然后顺手把它们加起来. 这时候发现加起来的和在量级很小的时候(10^-20)跟dot_product不同, 不过还在同一个量级内的不同. 但在量级比较大的时候(10^-3)结果则相同.[/quote]

这个是因为:你在做加法的时候,可能出现 精度丢失 的情况,比如两个差不多的浮点数想减,导致前面的有效数字丢失。

6 楼

差很多的是会丢失的
比如1加上10的-16次

7 楼

epsilon这个函数得到机器精度
real*8 :: x,y

y=epsilon(x)

y=y/2.0d0+1.0d0

8 楼

但是按理来讲, dot_product的算法跟对应项相乘之后相加(在real型向量下)应该是一样的. 以上两位讲到的精度问题导致有效数字丢失那应该也是一起丢失, 为什么最终算出来两个结果会有差别呢.

9 楼

你看下horner scheme
http://en.wikipedia.org/wiki/Horner_scheme
有时候为了避免精度损失会提取公共部分的 我不知道你说的问题是不是由于计算方式不同造成的
如果先乘再加 如果数差的比较大就有损失了

10 楼

不知道是不是我表达的不够清楚. 后面的问题是dot_product这个函数算出来的结果跟我自己动手一项项相乘然后加起来的结果不一致. 对于点乘来讲没有公共部分.
昨天一个群友也遇到类似的事, 就是用 SUM(CONJG(vector_a)*vector_b) (他算的向量是复数) 代替dot_product这个函数, 算出来结果有出入.

付dot_product说明



DOT_PRODUCT
Transformational Intrinsic Function (Generic): Performs dot-product multiplication of numeric or logical vectors (rank-one arrays).

Syntax 

result = DOT_PRODUCT (vector_a, vector_b)


vector_a 
(Input) Must be a rank-one array of numeric (integer, real, or complex) or logical type.


vector_b 
(Input) Must be a rank-one array of numeric type if vector_a is of numeric type, or of logical type if vector_a is of logical type. It must be the same size as vector_a. 
Results: 

The result is a scalar whose type depends on the types of vector_a and vector_b.

If vector_a is of type integer or real, the result value is SUM (vector_a*vector_b).

If vector_a is of type complex, the result value is SUM (CONJG (vector_a)*vector_b).

If vector_a is of type logical, the result has the value ANY (vector_a .AND. vector_b).

If either rank-one array has size zero, the result is zero if the array is of numeric type, and false if the array is of logical type.

我来回复

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