Fortran索引类似于Matlab



我有一个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有子数组索引功能。

你的代码有很多缺陷,我不得不假设heightT1是真实的数组。你可以使用以下命令获得你想要的结果(至少是我理解的你想要的):

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组成


最新更新