主题:[讨论]关于定义一个100*100*100的三维数组的问题
我就是个小白
[专家分:30] 发布于 2012-05-23 11:04:00
real::x(:),y(:),z(:)
call random_seed()
do i=1,100
call random_number(x(i))
call random_number(y(i))
call random_number(z(i))
enddo
这是我定义的一个空间三维数组,要求空间中的每个点都是随机的,但是出现以下错误:
error 1055 - Z is not a dummy argument, or a POINTER or ALLOCATABLE array, so cannot be assumed-shape
error 1055 - Y is not a dummy argument, or a POINTER or ALLOCATABLE array, so cannot be assumed-shape
error 1055 - X is not a dummy argument, or a POINTER or ALLOCATABLE array, so cannot be assumed-shape
回复列表 (共11个回复)
沙发
我就是个小白 [专家分:30] 发布于 2012-05-23 11:25:00
我用point(x(:),y(:),z(:))定义了反而错的更多。。。
板凳
臭石头雪球 [专家分:23030] 发布于 2012-05-23 13:54:00
x y z 数组必须给出明确的大小。
不能用 real x(:),y(:),(z)
这样的。
如果你想用可变的数组,请使用 allocatable 语句。
否则,只能对虚参进行这样的声明。
而且这是三个一维数组,不能称呼为“三维数组”
3 楼
我就是个小白 [专家分:30] 发布于 2012-05-23 15:08:00
我把它改成下面这个了
real,allocatable::x(:,:,:)
call random_seed()
allocate( x(100,100,100) )
do i=1,100
do j=1,100
do k=1,100
call random_number(x(i,j,k))
enddo
enddo
enddo
但是这个三维数组某2点之间的距离怎么计算啊?比如x(1,1,1)这一点和x(1,1,2)之间的距离
4 楼
臭石头雪球 [专家分:23030] 发布于 2012-05-23 15:35:00
l = sqrt( x * x + y * y + z * z )
5 楼
我就是个小白 [专家分:30] 发布于 2012-05-23 15:50:00
[quote]l = sqrt( x * x + y * y + z * z )[/quote]
不对啊,比如x(1,1,1)=12,x(1,1,2)=14,他们之间的距离怎么算?x(i,j,k)不是代表三维坐标,只是代表三维空间中的某点
6 楼
臭石头雪球 [专家分:23030] 发布于 2012-05-23 17:16:00
不同的点如何区别?难道不是用坐标么?
sqrt( (1-1)**2 + (1-1)**2 + (1-2)**2 )
如果不是这样的。那这个问题就不是 Fortran 的问题了,而是你的算法问题。
我不知道你期望的意图,不知道你期望用什么量表达什么意思。
但是两点的距离就是这么算的。
[quote]
x(i,j,k)不是代表三维坐标,只是代表三维空间中的某点[/quote]
程序不能表达一个点,一个杯子,一个桌子,一个房间。
程序里没有这些元素,你只能用这些东西的某些属性来在程序中被表示。
7 楼
我就是个小白 [专家分:30] 发布于 2012-05-23 19:40:00
real,allocatable::x(:,:,:)
call random_seed()
allocate( x(100,100,100) )
do i=1,100
do j=1,100
do k=1,100
call random_number(x(i,j,k))
enddo
enddo
enddo
那看来用上述方法来随机生成一组三维坐标不行了啊,这个只能生成三维随机数组,但是怎么用fortran生成三维坐标啊?在网上看到用VC生成坐标的方式是这样的:
#include <time.h>
struct 3DPoint
{
int x;
int y;
int z;
};
3DPoint pt[100];
void PtCreate()
{
srand((unsigned)time(NULL));
for(int i=0;i<100;i++)
{
pt[i].x = rand()%100;
pt[i].y = rand()%100;
pt[i].z = rand()%100;
}
}
生成100*100*100的三维坐标,也就是说有100万个坐标点
do i=1,1000000
a(i)=(call random_number(x),call random_number(y),call random_number(z))
enddo
这样就生成了100万个坐标点,不知道对不对?如果对的话怎样用程序计算某2个坐标点的距离?
8 楼
臭石头雪球 [专家分:23030] 发布于 2012-05-23 21:48:00
这有什么区别吗?
表示一个点,与表示一个点的坐标有区别吗???
你如何表示一个点?
难道不是用坐标表示???
难道不是坐标的平方和的根号算距离??
我对你的问题已经理解得越来越模糊了。
9 楼
我就是个小白 [专家分:30] 发布于 2012-05-23 22:18:00
[quote]这有什么区别吗?
表示一个点,与表示一个点的坐标有区别吗???
你如何表示一个点?
难道不是用坐标表示???
难道不是坐标的平方和的根号算距离??
我对你的问题已经理解得越来越模糊了。
[/quote]
对啊,就是要用程序来产生一组三维坐标,并计算坐标点与坐标点之间的距离,虽然知道是用2点坐标差的平分和的根号来算距离,但是不知道怎么用程序实现。。。
10 楼
我就是个小白 [专家分:30] 发布于 2012-05-24 02:30:00
貌似可以用这个方法
call random_seed()
do i=1,1000
a(i)=(call random_number(x),call random_number(y),call random_number(z))
enddo
do i=1, 1000
do j=i, 1000
call distance( a(i), a(j))
end do
end do
subroutine distance (a, b, dis)
implicit none
real*8 :: a(3), b(3), dis
dis = sqrt ((a(1)- b(1))**2 + (a(2) - b(2))**2 + (a(3)- b(3))**2)
end subroutine
我来回复