【问题标题】:Asking proper do loop fortran询问正确的 do loop fortran
【发布时间】:2022-01-12 15:35:04
【问题描述】:

我写了一段代码,用于测量距离k的意思。

所以,r 是我的数据点的数组。我想用每个质心减少数据点的每个坐标。因此,流程就像,J 只有在 y=k 时才会改变。同时我应该继续前进(我的号码应该保持更新+1)。距离是二维数组,Z 是列索引。距离是空的二维数组,该值将由减少的结果填充,这就是为什么每次计算都应该更新 i 的值。 N 是数据点的数量,k 是集群的数量。 z、k 和 n 是不同的值。

我当前代码的问题,

do i=1,z
   do j=1,n
      y=1
     do while 
        y<=k 
        distance(1,i)=abs( r(1,j) - centroid (1,y) )
        distance(2,i)=abs( r(2,j) - centroid (2,y) )
        y=y+1
     end do
   end do
end do

问题在于,i 值没有保持更新。我需要我的价值不断增加,+1

【问题讨论】:

  • 您好 Dono Don,欢迎来到 Stack Overflow :) 恐怕您的问题非常令人困惑。 z 应该是什么?应该什么时候更新?如果您还没有看过它们,您可能需要查看 tourhow to ask
  • 我还是一头雾水;如果z是列索引,为什么它也是外循环的上限?外循环应该做什么?
  • 另外,kn 是什么?它们是常数,还是应该通过循环改变?
  • 就像@veryreverie 我真的无法理解你想说的话。是不是像distance(1,z) 一样简单,你应该用i 替换z
  • 抱歉给您带来了困扰,感谢您的关注和指正

标签: loops fortran k-means


【解决方案1】:

这是一个猜测,因为我仍然对你的问题感到困惑,但这就是你想要的吗?

i = 0
do j=1,n
  do y=1,k
    i = i+1
    distance(:,i) = abs(r(:,j)-centroid(:,y))
  enddo
enddo

所以在r 数组上循环j,在centroid 数组上循环y(但最多只能到k),并为两者的每个组合递增i

这假设distance 数组足够大,i 不会超出它。

【讨论】:

  • 谢谢,我认为 i 值,(在我的例子中,z,数组的形状应该预定义为分配数组 fortran)。显然不是
  • 对不起,我还是不太明白。您是说应该预定义iz?您仍然必须先分配distance,然后才能为其添加值。
  • 是的,但之前我认为 z 值应该是固定的,即 30。我不知道我们可以把零放在首位并动态更改。这就是为什么我做了 i=1,z 。我假设是因为我经常收到错误 'array cannt have deferred shape' 。我认为这意味着我们必须固定数字。
  • 数组的大小在分配时必须固定(尽管以后可以通过重新分配来更改)。但是i 是一个变量;你可以随心所欲地改变它。重要的是你不能用大于distance 的第二维的i 调用distance(foo,i)
猜你喜欢
  • 2018-02-02
  • 2016-09-07
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 2019-02-23
相关资源
最近更新 更多