主题:transpose疑问
tianhy2010
[专家分:60] 发布于 2010-07-27 09:17:00
transpose用法有几个小疑问:
1.是用来求转置矩阵的吧?比如能把c(2,3)转成(3,2)的
2.是否不能用在一维数组上?比如:b=(1,2,3,4),transpose(b)就会出错啦
3.如果想把一维数组转置,该用哪个函数来?还是要自己编程实现?
回复列表 (共8个回复)
沙发
yeg001 [专家分:14390] 发布于 2010-07-27 10:19:00
TRANSPOSE
Transformational Intrinsic Function (Generic): Transposes an array of rank two.
Syntax
result = TRANSPOSE (matrix)
matrix
[color=FF0000](Input) Must be a rank-two array (of any data type). [/color]
Results:
The result is a rank-two array with the same type and kind parameters as matrix. Its shape is (n, m), where (m, n) is the shape of matrix. For example, if the shape of matrix is (4,6), the shape of the result is (6,4).
Element (i, j) of the result has the value matrix (j, i), where i is in the range 1 to n, and j is in the range 1 to m
一维数组不存在转置问题, 一定要转置定义的时候定义为a(n,1)
楼主, 似乎你问的好几个矩阵相关问题都是书里面有的. 就算书里面函数写得不详细你看看编译器的帮助也可以找到这些函数的描述.
板凳
adda [专家分:1520] 发布于 2010-07-27 11:13:00
reshape( b, [ size(b), 1 ] )
3 楼
cgl_lgs [专家分:21040] 发布于 2010-07-27 11:19:00
是可以用reshape来重新改变其形状(如维度)
但应该是这样的:
reshape(b,(/size(b),1/))
楼上的确定方括号也行么:)俺确实没试过:)
4 楼
adda [专家分:1520] 发布于 2010-07-27 21:18:00
[quote]是可以用reshape来重新改变其形状(如维度)
但应该是这样的:
reshape(b,(/size(b),1/))
楼上的确定方括号也行么:)俺确实没试过:)[/quote]
intel fortran很早就支持了
现在已经写入到了fortran2003标准中
5 楼
cgl_lgs [专家分:21040] 发布于 2010-07-27 23:16:00
回adda兄:
原来是这样儿的啊:)
谢谢,学习了:)
6 楼
aliouying [专家分:1150] 发布于 2010-07-28 08:10:00
(/a1,a2/) 这样可以表示为一个数组(不知道这么说合不合适)
例如: real :: A
A = (/a1,a2/)
7 楼
mastergxm [专家分:0] 发布于 2012-08-14 16:26:00
[quote]回adda兄:
原来是这样儿的啊:)
谢谢,学习了:)[/quote]
关于TRANSPOSE,我有一个疑问,就是像 MATMUL(TRANSPOSE(R),S) 这种代码中,
TRANSPOSE以及MATMUL这样的库函数会影响运算速度吗?我遇到的一种情况是R和S都是一维数组,只不过都是N行一列的,我想用一个DO循环来代替上面的代码,会不会使计算速度快一点呢?
8 楼
臭石头雪球 [专家分:23030] 发布于 2012-08-14 18:41:00
[quote]关于TRANSPOSE,我有一个疑问,就是像 MATMUL(TRANSPOSE(R),S) 这种代码中,
TRANSPOSE以及MATMUL这样的库函数会影响运算速度吗?我遇到的一种情况是R和S都是一维数组,只不过都是N行一列的,我想用一个DO循环来代替上面的代码,会不会使计算速度快一点呢?[/quote]
这是一个复杂的问题。
到底哪个代码更快?
这个没有定论。matmul,transpose这些函数,语法规则只规定了如何使用。而没有规定内部到底如何实现。各家编译器都可以选择自己的方式去实现它。
所以,这与你使用的编译器品牌,版本,编译选项里对优化程度的选择都有关。
我觉得最好的办法,就是你分别写一个,自己实验一下。
个人认为,这俩者差别应该是不大的。
我来回复