Pointers 指向实+;imag部分,反之亦然
复杂到真实+图像部分 给定一个复数数组,我们可以在中的答案后面为它的实部和虚部分配指针Pointers 指向实+;imag部分,反之亦然,pointers,fortran,Pointers,Fortran,复杂到真实+图像部分 给定一个复数数组,我们可以在中的答案后面为它的实部和虚部分配指针 主程序 使用iso_c_绑定 隐式无 复合物,目标::z(2)=[(1,2)、(3,4)] 实数,指针::re(:),im(:),buf(:) 调用c_f_指针(c_loc(z),buf,shape=[大小(z)*2]) re(1:2)=>buf(1:2) im(1:2)=>buf(2:2) 打印*,'z',z 打印*,'re',re 打印*,“即时消息”,即时消息 结束程序 real+imag部分到复合体
主程序
使用iso_c_绑定
隐式无
复合物,目标::z(2)=[(1,2)、(3,4)]
实数,指针::re(:),im(:),buf(:)
调用c_f_指针(c_loc(z),buf,shape=[大小(z)*2])
re(1:2)=>buf(1:2)
im(1:2)=>buf(2:2)
打印*,'z',z
打印*,'re',re
打印*,“即时消息”,即时消息
结束程序
real+imag部分到复合体
我的问题是如何反过来做?
给定两个实数组re,im
。如何分配复数指针z
,其中实部由re
给出,虚部由im
给出?类似于
主程序
隐式无
real,target::re(2)=[1,3],im(2)=[2,4]
复数,指针::z(:)
z=>cmplx(re,im)!不工作,因为cmplx不返回指针结果
结束程序
甚至可能是因为
re,im
在内存中并不总是连续的吗?这是不可能的,但通常的问题是为什么要使用指针来实现这一点。你能解释一下你想做什么吗?(例如,请注意,在大多数情况下,我很乐意使用z%re=[1,2,3.]!设置实组件,而不是使用指针。)Intel的mkl提供了一个迭代解算器dfgmres,它只适用于双精度。我需要一个复杂的系统,也就是zfgmres。因此,我想在复数数组和实数数组之间切换(我将复数余数映射到长度为实数数组两倍的数组)。长话短说:我希望它是高效的,并且不复制不必要的数据。实际上,实部和虚部在一个(!)长的连续内存s.t数组中。我可以使用与第一个示例中类似的东西。如果没有复制,是不是不可能将实部和imag部的两个单独数组重铸(或组合)为一个复杂数组?(因为每个复变量的Re和Im部分需要在内存中相邻。)这是不可能的,但通常的问题是为什么要使用指针来完成这项工作。你能解释一下你想做什么吗?(例如,请注意,在大多数情况下,我很乐意使用z%re=[1,2,3.]!设置实组件,而不是使用指针。)Intel的mkl提供了一个迭代解算器dfgmres,它只适用于双精度。我需要一个复杂的系统,也就是zfgmres。因此,我想在复数数组和实数数组之间切换(我将复数余数映射到长度为实数数组两倍的数组)。长话短说:我希望它是高效的,并且不复制不必要的数据。实际上,实部和虚部在一个(!)长的连续内存s.t数组中。我可以使用与第一个示例中类似的东西。如果没有复制,是不是不可能将实部和imag部的两个单独数组重铸(或组合)为一个复杂数组?(因为每个复变量的Re和Im部分需要在内存中相邻..)