Fortran Coder

查看: 15662|回复: 8
打印 上一主题 下一主题

[求助] fortran 中 矩阵与向量计算问题

[复制链接]

6

帖子

2

主题

0

精华

入门

F 币
39 元
贡献
22 点
跳转到指定楼层
楼主
发表于 2019-6-23 14:21:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
implicit none
integer::a(3,1)

a(1,1)=1
a(2,1)=2
a(3,1)=3

假如有一列向量a,应该如何计算a向量的转置乘a。我想用matmul(transpose(a),a)但不可以,请问该如何做呢?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1644 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2019-6-23 16:06:13 | 只看该作者
[Fortran] 纯文本查看 复制代码
integer::a(1,3)
a(1,:)=[1,2,3]
write(*,*) matmul(transpose(a),a)

6

帖子

2

主题

0

精华

入门

F 币
39 元
贡献
22 点
板凳
 楼主| 发表于 2019-6-23 17:04:00 | 只看该作者
fcode 发表于 2019-6-23 16:06
[mw_shl_code=fortran,true]integer::a(1,3)
a(1,:)=[1,2,3]
write(*,*) matmul(transpose(a),a)[/mw_shl_c ...

您好!您这个是用列*行得到一个3*3的数组,好像计算没问题。但如果调换顺序,计算行*列的时候,结果是14,直接write是可以的,但用变量表示就不行。请问是什么原因呢?
integer::k
k=matmul(a,transpose(a))
write(*,*) k

提示错误The shapes of the array expressions do not conform.   [K]       

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
地板
发表于 2019-6-23 17:37:04 | 只看该作者
妙木山养娃人 发表于 2019-6-23 17:04
您好!您这个是用列*行得到一个3*3的数组,好像计算没问题。但如果调换顺序,计算行*列的时候,结果是14 ...

这就是Fortran这类强类型语言的一个大坑在此
1*3的矩阵和3*1的矩阵得到的东西,程序认为是一个1*1的矩阵而不是一个数
程序并不认为1*1的矩阵和一个数是一回事
对此,你可以设一个1*1的矩阵变量接收矩阵乘法的结果,然后再取这个矩阵第一行第一列的元素即可

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
5#
发表于 2019-6-23 17:38:40 | 只看该作者
liudy02 发表于 2019-6-23 17:37
这就是Fortran这类强类型语言的一个大坑在此
1*3的矩阵和3*1的矩阵得到的东西,程序认为是一个1*1的矩阵 ...

这个坑其实还不算常见,更常见的坑是n*1的或者1*n的矩阵和n个元素的向量不是一回事
初学者在这个地方被坑的更多些……

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1644 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

6#
发表于 2019-6-23 17:42:42 | 只看该作者
可以用
k=sum(matmul(a,transpose(a))) 呀

6

帖子

2

主题

0

精华

入门

F 币
39 元
贡献
22 点
7#
 楼主| 发表于 2019-6-23 18:02:46 | 只看该作者
fcode 发表于 2019-6-23 17:42
可以用
k=sum(matmul(a,transpose(a))) 呀

好的,十分感谢

6

帖子

2

主题

0

精华

入门

F 币
39 元
贡献
22 点
8#
 楼主| 发表于 2019-6-23 18:05:12 | 只看该作者
liudy02 发表于 2019-6-23 17:38
这个坑其实还不算常见,更常见的坑是n*1的或者1*n的矩阵和n个元素的向量不是一回事
初学者在这个地方被坑 ...

谢谢 很惭愧,以前学程序很马虎,也不常用,现在需要自己编程的时候才发觉捉襟见肘

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
9#
发表于 2019-6-23 18:19:39 | 只看该作者
fcode 发表于 2019-6-23 17:42
可以用
k=sum(matmul(a,transpose(a))) 呀

唔,还是你这个办法简洁,我咋就没想到呢……
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-28 17:02

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表