我有一个T(60000x8)矩阵,我想对它进行排序。
在Matlab中,我可以创建一个子矩阵,其中我对列8中具有相同值的行进行排序。
a1 = max(T(:,8)); x = [1.0:1:a1];
for i = 1.0:1:a1
T1 = T(T(:, 8)== x(i), :);
end
这个很好,完成了我的工作。
但是我想用Fortran执行类似的操作。
我尝试了以下方法:
read(7,*) *(height(i,j),j=1,8)
k=maxval(height(:,8))
a1 = int(height(:,8))
allocate(x(k), T1(k,8))
do i=1,k
x(i) = i
end do
do i = 1, k
T1 = height((a1(i)== x(i)),:)
end do
当编译时,给出错误
Error: Array index at (1) must be of INTEGER type, found LOGICAL
Fortran不是Matlab;)…Matlab有一个使用布尔值提取子数组的特性,Fortran没有。但是Fortran有子数组索引功能。
你的代码有很多缺陷,我不得不假设height
和T1
是真实的数组。你可以使用以下命令获得你想要的结果(至少是我理解的你想要的):
integer :: i
integer, allocatable :: idx(:)
real, allocatable :: x(:), T1(:,:)
a1 = nint(height(:,8))
x = [(i,i=1,size(a1))]
idx = pack( x, mask=(a1==x) )
T1 = height(idx(:),:)
说明,例如:
a1 : [4 2 3 1 5]
x : [1 2 3 4 5]
(a1 == x) : [F T T F T]
idx : [ 2 3 5] ! 3 elements
T1
将由height
的列2、3、5组成