GCC版本4.6
问题:要找到一种方法,将参数输入到可执行文件中,例如a.out,从命令行 - 更具体地说,输入一个双精度数字数组.
尝试:使用READ(*,*)标准中较旧的命令:程序test.f-
PROGRAM MAIN
REAL(8) :: A,B
READ(*,*) A,B
PRINT*, A+B, COMMAND_ARGUMENT_COUNT()
END PROGRAM MAIN
Run Code Online (Sandbox Code Playgroud)
执行 -
$ gfortran test.f
$ ./a.out 3.D0 1.D0
Run Code Online (Sandbox Code Playgroud)
这没用.经过一番反省,发现了
$./a.out
3.d0,1.d0
4.0000000000000000 0
Run Code Online (Sandbox Code Playgroud)
确实有效,但第二行是输入提示,并且没有实现以单行完成此操作的目标.此外COMMAND_ARGUMENT_COUNT(),与PERL不同,显示输入提示中的数字实际上并不算作"命令行参数".
经验:
fortran大约3个月
python - 中间:在此之前从未在python中使用过ctypes模块
我正在寻找一种方法来在python中使用fortran代码进行我的博士工作 - 随后使用matplotlib即时使用可视化计算进行可视化.
这个帖子有帮助(这告诉我可以使用ctypes模块在python中使用/调用fortran代码 - 并且鉴于fortran函数具有绑定到它们的备用名称 - 这在逻辑上对我有意义,尽管我不知道它是如何工作的细节,但我们不要选择我们的战斗明智的!).
然后这个SO帖子也处理从python调用fortran函数.
下一个合乎逻辑的步骤是查找python模块ctypes的文档.这里讨论了如何在API级别使用python访问共享库.
我把所有的部分都做成了一个最小的工作示例,另一个答案已经完成了.但我想看看涉及真实浮点数的输出机制和数学运算.这是我做的测试用例.
function prnt(s)
character(80):: s
logical :: prnt
print*, s
prnt = .true.
end function prnt
function sin_2(r)
real:: r,sin_2
sin_2 = sin(r)**2
end function sin_2
Run Code Online (Sandbox Code Playgroud)
$gfortran -shared -g -o test.so test.f90
Run Code Online (Sandbox Code Playgroud)
编辑:由于某种原因,我的工作计算机需要-fPIC选项进行编译
为了确保我的两个功能prnt,sin_2并在那里,我检查nm:
$ nm test.so | tail -3
0000067f T prnt_
0000065c T sin_2_ …Run Code Online (Sandbox Code Playgroud) 关于 SO 上的堆栈的问题,终于!我的一生都让我走到了这一步。
所以我需要将我制作的一些相当大的自定义数据结构合并到一个堆栈中。我决定编写一个仅包含一个整数值的最小堆栈结构。这里是 -
MODULE STACK_MODULE
IMPLICIT NONE
TYPE ELEMENT_TYPE
INTEGER(4) :: VAL
TYPE(ELEMENT_TYPE), POINTER :: PREV
END TYPE ELEMENT_TYPE
TYPE STACK_TYPE
INTEGER(4) :: SIZE=0
TYPE(ELEMENT_TYPE), POINTER :: LASTIN
END TYPE STACK_TYPE
CONTAINS
SUBROUTINE PUSH(VAL_,STACK)
IMPLICIT NONE
INTEGER(4), INTENT(IN) :: VAL_
TYPE(STACK_TYPE), INTENT(INOUT) :: STACK
TYPE(ELEMENT_TYPE),TARGET :: CURRENT
! INIT CURRENT
CURRENT%VAL = VAL_
CURRENT%PREV => STACK%LASTIN
! ADD CURRENT TO STACK
STACK%LASTIN => CURRENT
STACK%SIZE = STACK%SIZE+1
RETURN
END SUBROUTINE PUSH
SUBROUTINE POP(STACK,VAL_)
IMPLICIT NONE
TYPE(STACK_TYPE), INTENT(INOUT) :: …Run Code Online (Sandbox Code Playgroud) Json 不仅可用作 API 的通信工具,还可用作将运行程序配置为初始化的标记。
我在 json 模式中遇到了为了重用而使用引用的情况。
由于 json 模式是有效的 json,我曾期望 python json 库能够扩展引用。
$ cat test.json
{
"template":{
"a":"a",
"b":"b",
"pi":3.14
},
"value": { "$ref":"#/template"}
}
python -c "from json import load; fp = open(\"test.json\",\"r\"); print(load(fp))"
{'template': {'a': 'a', 'b': 'b', 'pi': 3.14}, 'value': {'$ref': '#/template'}}
Run Code Online (Sandbox Code Playgroud)
在 python 中扩展引用的最简单方法是什么,因为 python dicts 不能指向它们自身的其他部分(我认为)?
我尝试构建一个最小的示例来重现我遇到的问题。请忽略随机生成的数据数组x和y。我正在将非常有意义的数据输入到zSpline内部调用中plot_surface。您可以尝试将倒数第二行替换为 -surf=ax.plot_surface(xg,yg,z,rstride=1,cstride=1,cmap=cm.coolwarm,linewidth=0.1)我已将 ZSpline 替换为粗数据z。这向我表明我在语法上没有弄错。
我的代码是-
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
from scipy.interpolate import RectBivariateSpline
size=21
dat = np.random.randn(size, 2)
x=dat[:,0]
y=dat[:,1]
z=np.random.randn(size//3,size//3)
i=np.tile([1,2,3],size//3)
bool_dat=(i==1)
x_new=x[bool_dat]
y_new=y[bool_dat]
xi=np.linspace(x_new.min(),x_new.max(),size//3)
yi=np.linspace(y_new.min(),y_new.max(),size//3)
#print z.shape,xi.shape,yi.shape
zSpline = RectBivariateSpline(xi,yi,z)
xg,yg = np.meshgrid(xi,yi)
print zSpline(xg,yg)
fig=plt.figure()
ax=fig.gca(projection='3d')
surf=ax.plot_surface(xg,yg,zSpline(xg,yg),rstride=1,cstride=1,cmap=cm.coolwarm,linewidth=0.1)
plt.show()
Run Code Online (Sandbox Code Playgroud)
我得到的错误是 -
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-13-a98e6c15985e> in <module>()
22
23 xg,yg …Run Code Online (Sandbox Code Playgroud) 这应该是不言自明的
>>> (1+2j).real #Normal Usage
1.0
>>> (1+2j).imag #Normal Usage
2.0
>>> 1+2j.real #Normal Usage
1.0
>>> 1+2j.imag #Flips Out
3.0
>>> 123+657j.real
123.0
>>> 123+657j.imag
780.0
Run Code Online (Sandbox Code Playgroud)
z.imag以某种方式累加了实部和虚部.
我发现这很有趣..这是一个错误还是这是一个故意的功能?
jq 文档中的以下示例按预期工作-
$ echo '[1,2]' | jq 'map(in([0,1]))'
[
true,
false
]
Run Code Online (Sandbox Code Playgroud)
但是将值转换为字符串失败了 -
$ echo '["1", "2"]' | jq 'map(in(["0","1"]))'
jq: error (at <stdin>:1): Cannot check whether array has a string key
Run Code Online (Sandbox Code Playgroud)
为了确保这不是 shell 引用问题,我还尝试过——
$ echo "[\"1\", \"2\"]" | jq 'map(in(["0","1"]))'
jq: error (at <stdin>:1): Cannot check whether array has a string key
Run Code Online (Sandbox Code Playgroud)
除此之外,以下代码段也失败了,这可能是由于将 0 强制转换为布尔值 false -
$ echo '[0,1]' | jq 'map(in([1,2]))'
[
true,
true
]
Run Code Online (Sandbox Code Playgroud)