不确定标题是否放好.建议欢迎.
这就是我想要做的.检查一个条件,然后决定在循环中使用哪个函数.例如:
if (a < 0) then
loop_func = func1
else
loop_func = func2
endif
Run Code Online (Sandbox Code Playgroud)
然后我可以loop_func在编写循环时用作指针.这两个函数都采用完全相同的输入,并且是基于值的解决问题的不同方法a.这将允许我只有一个代码块,而不是两个几乎相同的块.这也适用于子程序.
有什么想法可以实现吗?
谢谢.
我最初使用的是python 2.7,它经常与操作系统捆绑在一起(目前使用的是Linux Mint 12).我想尝试python 3,所以我将它与python 2一起安装.一切都很好,我可以在终端中通过调用python或运行两个版本python3.但是,似乎没有办法用python 3启动IDLE.当我启动时,是否有一些标志可以传递给IDLE,以便我可以选择运行哪个版本的python?
例如,(这些不工作)
idle3或idle --shell=python3或类似的东西.希望你明白我的意思.我在这个问题中读到了关于ID3 for Python 3(在Vista上)的不同可执行文件.但是,我似乎无法在Linux上做类似的事情.
我的问题是非常相似,这个和这个,也该问题.我有一个geom_point使用特定调色板的因子着色的散点图(使用).我正在使用stat_smooth通过点绘制某些平滑线,按另一个因子分组.我希望这些线条使用不同的调色板.
currDT <- read.table("SO_data", sep = "|", header = TRUE, strip.white = TRUE)
Run Code Online (Sandbox Code Playgroud)
我通常将数据放在data.table中,因此您可能会发现它也有帮助.哦,这是我目前正在使用的配色方案,你可以用它scale_colour_brewer来生成你自己的配色,我只是为了完整而包含这个.
my_col_scheme <- c("#e41a1c", "#377eb8", "#4daf4a", "#984ea3", "#ff7f00", "#7B8A7B",
"#0B29D6", "#f781bf", "#999999", "black")
Run Code Online (Sandbox Code Playgroud)
希望这很清楚.这是一些示例代码:
icorr_elec <- ggplot(currDT,
aes(x = EFP, y = SAPT), na.rm = TRUE) +
geom_point(aes(colour = Anion, shape = Cation), size = 3, alpha = 0.4) +
scale_colour_manual(values = my_col_scheme) +
stat_smooth(method = "lm", formula …Run Code Online (Sandbox Code Playgroud) 当我对Fortran进行编码,并使用制表符进行缩进时,Vim会以红色突出显示这些空格,因为在较旧的Fortran中,前6列是特殊的,并保留用于标签/行号和连续符号.我怎么能让Vim停止这样做呢?
谢谢.
我试图用来forall分配动态数组,但gfortran并不喜欢这样.我还发现write一个forall块中禁止使用语句,我怀疑read语句也是如此.
forall块中不允许哪些其他功能/操作?
究竟什么是这个结构,除了有时do在顺序无关紧要时更换循环?我认为它会使编码更清晰,更优雅,尤其是在操作顺序不重要的时候显示,但是对于可以在内部进行的操作而言似乎相当严格forall.
这些限制的原因是什么,即它们保护/防止用户搞砸了什么?使用它是个好主意forall吗?如果是这样,为了什么目的?
现在在我正在处理的代码中只有一个forall块,如果我将它全部翻译成do循环,它将提供四个嵌套循环.哪种方式更好?
我正在尝试将错误检查纳入我正在编写的纯过程中.我想要像:
pure real function func1(output_unit,a)
implicit none
integer :: a, output_unit
if (a < 0) then
write(output_unit,*) 'Error in function func1: argument must be a nonnegative integer. It is ', a
else
func1 = a/3
endif
return
end function func1
Run Code Online (Sandbox Code Playgroud)
但是,不允许纯函数将IO语句赋予外部文件,因此我尝试将单元号传递给函数,例如output_unit = 6,这是默认输出.gfortran仍然认为这是非法的.有没有解决的办法?是否有可能使函数成为派生类型(而不是real此处的内部类型),在出现错误时输出字符串?
这有点复杂; 我欢迎任何关于如何提高问题清晰度的意见.
好吧,说我有一个数组:
real, allocatable :: A(:,:,:)
Run Code Online (Sandbox Code Playgroud)
我想在使用它之前分配它.第三维的大小是否可能取决于第二维的大小?
例如
do i=1,n
allocate(A(3,i,i**2))
end do
Run Code Online (Sandbox Code Playgroud)
显然以上都行不通.我想最终得到一个带有形状的数组(或一组数组)
(3,1,1), (3,2,4), (3,3,9), ... (3, n, n^2)
Run Code Online (Sandbox Code Playgroud)
其中第三维的大小是第二维的大小的平方.
我对依赖维度大小的规则有点复杂,但如果可以进行平方,我可以做其余的事情.
这可能吗?如果是这样,我如何在Fortran中实现它?
会有什么shape(A)回报?那会很有趣.
我的另一种选择是分配到所需的最大尺寸,并注意只在计算中使用某些元素,即
allocate(A(3,n,n**2))
Run Code Online (Sandbox Code Playgroud)
虽然我现在对记忆并不苛刻,但我希望有良好的编程习惯.无论如何,这是一个有趣的问题.
谢谢.
编辑:
如果维度的大小取决于另一维度中元素的值?
在下面的答案中,两个维度中数组的大小取决于B的索引.我想要的是某些东西
type myarray
real :: coord(3)
integer,allocatable :: lev(:)
integer, allocatable :: cell(:)
endtype myarray
type(myarray), allocatable :: data
allocate(data(m))
allocate(data%lev(n))
forall (j=1:n) !simple now, for argument's sake
lev(j)=j
endforall
! I was thinking of using a FORALL loop here, but the errors returned …Run Code Online (Sandbox Code Playgroud) 很抱歉,如果这是重复的,但我似乎无法在SO上的任何其他地方找到这些信息,即使它看起来像是一个简单的问题.我有一个数据框,有几列作为因素.其中一些是整数,有些是字符串.我想提取对应于特定因子的行.例如,
my_data <- read.table(file = "my_data.txt", header = TRUE)
my_data[ my_data$age == 20, ]
Run Code Online (Sandbox Code Playgroud)
这有效,但如果我再尝试
my_data[ my_data$gender == "male", ]
Run Code Online (Sandbox Code Playgroud)
这不会产生匹配.我意识到它们不是同一个东西,因为检查my_data$name[1]给出因子的类,而我正在检查字符串.
我在这里做错了什么想法?
干杯
数据样本:大小年龄性别值1 20男性0.5 4 22女性0.7 3 14女性0.3
与使用不同类型的元素创建数组完全相同的问题,除了如何在Fortran中执行此操作?
假设我想要一个第一维的数组,一个integer类型,第二个real和第三个character(字符串)类型.是否有可能struct在Fortran中创建一个" "?
谢谢.
这似乎是许多人会面临的一个问题,遵循不要重复自己 (DRY) 原则。我在任何地方都找不到答案,也许我一直在寻找错误的术语,这意味着我的问题标题可能不是很好。如果人们对如何命名问题有更好的建议,我们将不胜感激。
我有几个ggplot2图,它们都有一些共同的命令,以及其他变化太大的命令,因此将它们完全编写为循环/函数是不值得的。
如何将常用命令包含在一个整洁的单行中?
一个例子可能会更清楚地解释:
common.lines <- "theme_bw() +
geom_point(size = 2) +
stat_smooth(method = lm, alpha = 0.6) +
ylab("Height")"
my.plot <- ggplot(data = my_df, aes(x = "Length", y = "Height")) +
common.lines
jim.plot <- ggplot(data = jim_df, aes(x = "Width", y = "Height")) +
common.lines
Run Code Online (Sandbox Code Playgroud)
我的问题是,我该如何构建common.lines?制作像上面这样的字符串不起作用。我也尝试制作一个向量,然后paste用 with+作为分隔符。
有什么建议?
干杯
假设我有一个3D数组,A(1:3,1:4,1:5)我只想处理它的一部分,例如:
real :: A(1:3,1:4,1:5), B(1:5,1:2)
real, allocatable :: C(:,:)
allocate(C(size(A,1),size(B,2)))
C = matmul(A(1:3,1,1:5),B)
Run Code Online (Sandbox Code Playgroud)
Fortran看起来很好.但是,如果我需要处理转置,那么transposeFortran中的函数会混淆,例如:
real :: A(1:3,1:4,1:5), B(1:3,1:2)
real, allocatable :: C(:,:)
allocate(C(size(A,3),size(B,2)))
C = matmul(transpose(A(1:3,1,1:5)),B)
Run Code Online (Sandbox Code Playgroud)
如何使用Fortran交换数组中的维度?例如,我有A(3,4,5); 有没有一个函数/命令,它给了我A(5,4,3)或A(4,3,5)或我想要的任何安排?当然,没有做类似的事情,比如将A复制到具有所需顺序尺寸的虚拟阵列.我正在寻找简单的一线优雅方式.
谢谢.
在Fortran中,可以对数组进行操作,但是如何将派生类型的索引视为数组的一部分呢?代码将解释我想要做的最好的事情:
type mytype
integer :: b(3,3)
real :: c(4)
endtype
integer :: a(3,3)
real :: d(2,4)
type(mytype) :: mat(2)
!do stuff so that 'mat' gets values
....
!usually one does this
a = matmul(mat(1)%b, transpose(mat(2)%b))
!multiplying two 3x3 matrices
!but how does one do this? Note the "array"
d = matmul(mat(:)%c, mat(:)%c)
Run Code Online (Sandbox Code Playgroud)
我假设最后一行类似于2x4矩阵与自身相乘.但是,当我尝试编译时,gfortran抱怨道
错误:不得指定具有非零等级的两个或多个零件参考
Fortran可以做到这一点吗?
我的问题类似于这个与3D矩阵相乘的3D矩阵.但是,我在Fortran中编码.
再说了,如果我有一个RxSxT矩阵A和SxU矩阵B,其中R,S,T,U是整数,我要乘A(:,:,0)用B.我怎么能这样做matmul?当我做的事情
C(:,:,0) = matmul(A(:,:,0),B)
Run Code Online (Sandbox Code Playgroud)
编译器(gfortran)给出:
Warning:Array reference at (1) is out of bounds (0 < 1) in dimension 3
f951: internal compiler error: Segmentation fault
Run Code Online (Sandbox Code Playgroud)
有没有解决的办法?谢谢.
编辑:我应该补充一点,我实际上是转置第二个矩阵.再说了,A一个RxSxT矩阵和B一个UxS矩阵.然后
C(:,:,0) = matmul(B,transpose(A(:,:,0))
Run Code Online (Sandbox Code Playgroud)
转置可能是问题的一部分.它将A(i,j,k)转换为A(k,i,j)吗?