小编Sam*_*Tan的帖子

如何在Fortran中为函数名设置别名

不确定标题是否放好.建议欢迎.

这就是我想要做的.检查一个条件,然后决定在循环中使用哪个函数.例如:

if (a < 0) then
    loop_func = func1
else
    loop_func = func2
endif
Run Code Online (Sandbox Code Playgroud)

然后我可以loop_func在编写循环时用作指针.这两个函数都采用完全相同的输入,并且是基于值的解决问题的不同方法a.这将允许我只有一个代码块,而不是两个几乎相同的块.这也适用于子程序.

有什么想法可以实现吗?

谢谢.

alias fortran pointers function subroutine

27
推荐指数
2
解决办法
1万
查看次数

在Linux上使用python 3启动IDLE(并安装python 2.7)

我最初使用的是python 2.7,它经常与操作系统捆绑在一起(目前使用的是Linux Mint 12).我想尝试python 3,所以我将它与python 2一起安装.一切都很好,我可以在终端中通过调用python或运行两个版本python3.但是,似乎没有办法用python 3启动IDLE.当我启动时,是否有一些标志可以传递给IDLE,以便我可以选择运行哪个版本的python?

例如,(这些不工作) idle3idle --shell=python3或类似的东西.希望你明白我的意思.我在这个问题中读到了关于ID3 for Python 3(在Vista上)的不同可执行文件.但是,我似乎无法在Linux上做类似的事情.

python python-idle python-3.2

11
推荐指数
2
解决办法
6万
查看次数

ggplot2中两种不同颜色美学映射的不同调色板

我的问题是非常相似,这个这个,也问题.我有一个geom_point使用特定调色板的因子着色的散点图(使用).我正在使用stat_smooth通过点绘制某些平滑线,按另一个因子分组.我希望这些线条使用不同的调色板.

这是一些示例数据Dropbox链接.做一个

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)

r colors ggplot2

10
推荐指数
1
解决办法
7123
查看次数

在Vim中编辑Fortran时,摆脱标签空间的红色突出显示

当我对Fortran进行编码,并使用制表符进行缩进时,Vim会以红色突出显示这些空格,因为在较旧的Fortran中,前6列是特殊的,并保留用于标签/行号和连续符号.我怎么能让Vim停止这样做呢?

谢谢.

vi vim fortran

9
推荐指数
3
解决办法
9610
查看次数

Fortran forall限制

我试图用来forall分配动态数组,但gfortran并不喜欢这样.我还发现write一个forall块中禁止使用语句,我怀疑read语句也是如此.

forall块中不允许哪些其他功能/操作?

究竟什么是这个结构,除了有时do在顺序无关紧要时更换循环?我认为它会使编码更清晰,更优雅,尤其是在操作顺序不重要的时候显示,但是对于可以在内部进行的操作而言似乎相当严格forall.

这些限制的原因是什么,即它们保护/防止用户搞砸了什么?使用它是个好主意forall吗?如果是这样,为了什么目的?

现在在我正在处理的代码中只有一个forall块,如果我将它全部翻译成do循环,它将提供四个嵌套循环.哪种方式更好?

fortran loops fortran95

7
推荐指数
2
解决办法
5900
查看次数

纯Fortran程序中的I/O.

我正在尝试将错误检查纳入我正在编写的纯过程中.我想要像:

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此处的内部类型),在出现错误时输出字符串?

io error-handling fortran gfortran fortran95

7
推荐指数
1
解决办法
1241
查看次数

使用相互依赖的维度分配动态数组

这有点复杂; 我欢迎任何关于如何提高问题清晰度的意见.

好吧,说我有一个数组:

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)

fortran multidimensional-array dynamic-memory-allocation

5
推荐指数
1
解决办法
2817
查看次数

根据因子(字符串)从R数据框中提取行

很抱歉,如果这是重复的,但我似乎无法在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

r dataframe

5
推荐指数
1
解决办法
4万
查看次数

在Fortran中创建包含不同类型元素的数组

与使用不同类型的元素创建数组完全相同的问题,除了如何在Fortran中执行此操作?

假设我想要一个第一维的数组,一个integer类型,第二个real和第三个character(字符串)类型.是否有可能struct在Fortran中创建一个" "?

谢谢.

arrays struct fortran

3
推荐指数
1
解决办法
3453
查看次数

不同ggplot2图中的重复命令

这似乎是许多人会面临的一个问题,遵循不要重复自己 (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+作为分隔符。

有什么建议?

干杯

r dry ggplot2

3
推荐指数
1
解决办法
126
查看次数

Fortran转置矩阵不适用于非2D阵列

假设我有一个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 multidimensional-array matrix-multiplication

2
推荐指数
1
解决办法
6131
查看次数

将派生类型作为数组传递

在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可以做到这一点吗?

arrays fortran derived-types

2
推荐指数
1
解决办法
521
查看次数

使用matmul将数组的一部分乘以矩阵

我的问题类似于这个与3D矩阵相乘的3D矩阵.但是,我在Fortran中编码.

再说了,如果我有一个RxSxT矩阵ASxU矩阵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)吗?

fortran matrix matrix-multiplication

1
推荐指数
1
解决办法
1283
查看次数