此代码有效,但我想显式声明索引范围的类型max.但是,uX或者iX,当X = 8时,16或32给出编译错误.什么是正确的类型?
fn main() {
let mut arr2: [[f64; 3]; 3] = [[0.0; 3]; 3];
let pi: f64 = 3.1415926535;
let max = 3; // let max: i16 e.g. is wrong
for ii in 0..max {
for jj in 0..3 {
let i = ii as f64;
let j = jj as f64;
arr2[ii][jj] = ((i + j) * pi * 41.0).sqrt().sin();
println!("arr2[{}][{}] is {}", ii, jj, arr2[ii][jj]);
}
}
}
Run Code Online (Sandbox Code Playgroud) 我在Ubuntu 16.04上.我去了,File > Default Settings > Project Interpreter > add local并浏览了我的anconda3/long/path/python3.6.当我打开一个新项目或文件时,未选择anaconda解释器,而是创建基于系统默认python3解释器的虚拟环境/home/myname/venv并在其中使用.要改变它,我需要进入设置,搜索"解释器"并选择我之前添加的anaconda3,但这很麻烦!
我如何让PyCharm默认使用anaconda3解释器,并避免每次我需要编写脚本时在我的主文件夹中弹出那些恼人的虚拟环境?
我可以将编译此fortran代码称为“ test.f90”
subroutine test(g,o)
double precision, intent(in):: g
double precision, intent(out):: o
o=g*g
end subroutine
Run Code Online (Sandbox Code Playgroud)
与
gfortran -shared -fPIC test.f90 -o test.so
Run Code Online (Sandbox Code Playgroud)
并为Julia创建此包装函数test.jl:
function test(s)
res=Float64[1]
ccall((:test_, "./test.so"), Ptr{Float64}, (Ptr{Float64}, Ptr{Float64}), &s,res);
return res[1]
end
Run Code Online (Sandbox Code Playgroud)
并使用所需的输出运行以下命令:
julia> include("./test.jl")
julia> test(3.4)
11.559999999999999
Run Code Online (Sandbox Code Playgroud)
但是我想返回一个数组而不是一个标量。我想我已经在此答案中尝试了一切,包括使用iso_c_binding 。但是,我尝试的所有操作都会使我看起来像这样:
ERROR: MethodError: `convert` has no method matching convert(::Type{Ptr{Array{Int32,2}}}, ::Array{Int32,2})
This may have arisen from a call to the constructor Ptr{Array{Int32,2}}(...),
since type constructors fall back to convert methods.
Closest candidates are:
call{T}(::Type{T}, ::Any)
convert{T}(::Type{Ptr{T}}, ::UInt64) …Run Code Online (Sandbox Code Playgroud) 让所有例程都在模块内部。
如果我将数组real*8 aa(5,3)传递给例程
subroutine sub(bb)
real*8, intent(in) :: bb(2,5)
...
end subroutine
Run Code Online (Sandbox Code Playgroud)
用下面的语句call sub(aa),这将编译没有警告,前2 列的aa将填补bb阵列。数组aa和元素的bb排列方式非常不同。
如果相反,例程被编写
subroutine sub(bb)
real*8, intent(in) :: bb(:,:)
...
end subroutine
Run Code Online (Sandbox Code Playgroud)
然后bb将具有与相同的形状和存储顺序aa。
问:如果忘记了例程中存在显式大小的声明,则第一种行为是非常危险的。当显形数组更改形状/对齐方式时,我可以使编译器发出警告吗?
给定 numpy ndarrayA和一个整数数组I,形状相同,具有最高值和我们可以做的imax数组。但是,如果有重复的条目,则最后一个分配保留。我需要在对重复条目进行求和的同时执行此操作,例如B = np.zeros(imax)B[I] = AI
For i in range(A.size):
B[I.ravel()[i]] += A.ravel()[i]
Run Code Online (Sandbox Code Playgroud)
有没有好的方法可以做到这一点numpy?
例如,我想要这种行为(但既不是这样=也不是+=这样工作的)
A = np.array((1,2,5,9))
I = np.array((0,1,2,0),dtype=int)
B = np.zeros(3)
B[I] += A
print(B)
>>> array([10,2,5])
Run Code Online (Sandbox Code Playgroud)
1+9=10我们在第一个条目中看到。
我一直在使用gprof基准测试代码,但自从我开始并行化后,我发现gprof它没有提供有用的输出.
我如何描述或做一些有助于找到瓶颈的事情?
我听说过的Scalasca和TAU,但他们似乎有点大材小用.
在 VMD 中,我想使用 CPK 绘图方法加载每个新文件。由于某些技术原因,这似乎不是 .vmdrc 文件中的一个选项。
如何从 VMD 命令行执行此操作(以便我可以制作脚本)?或者是否有其他解决方案/解决方法/黑客可以使这项工作?
下面的代码可以工作,但是为了方便地改变数组的大小和循环的索引范围,变量max可以用来指定数组的维数吗?
fn main() {
let max: i64 = 3;
let mut arr2: [[f64; 3]; 3] = [[0.0; 3]; 3]; //replace 3 by max?
// let mut arr2: [[f64; max]; max] = [[0.0; max]; max]; //does not work
let pi: f64 = 3.1415926535;
let max2 = max as usize;
for ii in 0..max2 {
for jj in 0..max2 {
let i = ii as f64;
let j = jj as f64;
arr2[ii][jj] = ((i + j) * pi * …Run Code Online (Sandbox Code Playgroud) 我不知道Rust,但我想研究科学计算中的表现,将其与Julia和Fortran进行比较.我设法编写了以下程序,但问题是当MAX大于1022 时我得到运行时分段错误.有什么建议吗?
fn main() {
const MAX: usize = 1023;
let mut arr2: [[f64; MAX]; MAX] = [[0.0; MAX]; MAX];
let pi: f64 = 3.1415926535;
// compute something useless and put in matrix
for ii in 0.. MAX {
for jj in 0.. MAX {
let i = ii as f64;
let j = jj as f64;
arr2[ii][jj] = ((i + j) * pi * 41.0).sqrt().sin();
}
}
let mut sum0:f64 = 0.0;
//collapse to scalar like sum(sum(array,1),2) …Run Code Online (Sandbox Code Playgroud)