Questions tagged «c»

C是一种通用编程语言。C和它的近亲最初旨在实现系统软件,是大多数现代操作系统中使用的主要语言。由于其薄薄的抽象层和较低的开销,C允许对可用于科学计算的算法和数据结构进行高效编码。对于涉及C编程语言的问题,请使用此标签。

17
是否有适用于Python的高质量非线性编程求解器?
我要解决几个具有挑战性的非凸全局优化问题。目前,我使用了MATLAB的Optimization Toolbox(特别是fmincon()使用algorithm = 'sqp'),它非常有效。但是,我的大部分代码是在Python中进行的,我也想在Python中进行优化。是否存在可以与Python绑定竞争的NLP求解器fmincon()?它必须 能够处理非线性等式和不等式约束 不需要用户提供雅可比行列式。 如果不保证全局最优(fmincon()没有),也可以。我正在寻找一种即使在遇到挑战性问题时也可以收敛到局部最优的东西,即使它比慢一些fmincon()。 我尝试了OpenOpt提供的几种求解器,发现它们不如MATLAB的fmincon/sqp。 只是为了强调,我已经有了一个易于处理的公式和一个好的求解器。我的目标仅仅是更改语言,以使工作流程更加简化。 Geoff指出问题的某些特征可能是相关的。他们是: 10-400个决策变量 4-100个多项式相等约束(多项式范围从1到大约8) 有理不等式约束的数量大约等于决策变量数量的两倍 目标函数是决策变量之一 等式约束的雅可比行列是密集的,不等式约束的雅可比行列是密集的。

6
Fortran编译器真的好多少?
这个问题是对“ HPC的C ++ vs Fortran ”的答复中最近进行的两个讨论的扩展。而且,这不仅仅是一个挑战,而不是一个问题... 支持Fortran的最常听到的论据之一是编译器更好。由于大多数C / Fortran编译器共享相同的后端,因此为两种语言在语义上等效的程序生成的代码应该相同。但是,有人可能会争辩说,对于编译器来说,C / Fortran更容易实现优化。 因此,我决定尝试一个简单的测试:我获得了daxpy.f和daxpy.c的副本,并使用gfortran / gcc对其进行了编译。 现在daxpy.c只是daxpy.f(自动生成的代码,很难看的丑陋的)的f2c转换,所以我拿走了这段代码并对其进行了一些清理(满足daxpy_c),这基本上意味着将最里面的循环重写为 for ( i = 0 ; i < n ; i++ ) dy[i] += da * dx[i]; 最后,我使用gcc的向量语法重新编写了它(输入daxpy_cvec): #define vector(elcount, type) __attribute__((vector_size((elcount)*sizeof(type)))) type vector(2,double) va = { da , da }, *vx, *vy; vx = …
74 fortran  c  blas  benchmarking 

17
不将库用于标准数值算法是常见的,为什么?
科学计算库(如GSL)中提供了许多数值算法(积分,微分,内插,特殊函数等)。但是我经常看到带有这些功能的“手动”实现的代码。对于不一定要公开发行的小型程序,计算科学家是否普遍习惯在需要时自行实施数值算法(我的意思是从网站,数值食谱或类似软件进行复制或转录)?如果是这样,是否有特定的原因要避免链接到GSL之类的东西,还是比其他东西更“传统”? 我问是因为我是代码重用的忠实拥护者,这表明我应该尽可能尝试使用现有的实现。但是我很好奇,是否有理由认为原理在科学计算中没有在一般编程中那么有价值。 忘了提一下:我特别是在问C和C ++,而不是像Python这样的语言,使用Python有明显的好处(执行速度)。
54 libraries  c 

8
在C中解析蛋白质结构数据
我的背景是基因组学,但是最近我一直在研究与蛋白质结构有关的问题。我用C语言编写了一些相关程序,在此过程中从头开始构建了自己的PDB文件解析器。我不担心制作一个真正强大的解析器,我只是知道自己构建一个将是迫使自己真正理解PDB格式的最佳方法。 现在,我已经完成了这个过程,我正在寻找更坚固和成熟的东西。是否在C中实现了任何开源蛋白质结构库?我可以在Google上找到一些,但我以前从未听说过,而且它们似乎还不太成熟或稳定。一个稍微相关的问题:是否每个人都真的使用Python进行所有这些类型的计算吗?或自制代码? PS。我本质上是在寻找一个包含PDB文件解析器,用于计算键角,键长,扭转角,表面可访问表面积等的函数的库。

3
具有大数据集的计算问题的I / O策略?
我的研究小组专注于分子动力学,分子动力学显然可以生成千兆字节的数据作为单个轨迹的一部分,然后必须对其进行分析。 我们关注的几个问题涉及数据集中的相关性,这意味着我们需要跟踪内存中的大量数据并对其进行分析,而不是使用更多的顺序方法。 我想知道的是将大型数据集的I / O处理为脚本的最有效策略是什么。我们通常使用基于Python的脚本,因为它使对文件I / O的编码比使用C或Fortran的痛苦少得多,但是当我们有成千上万的行需要处理时,尚不清楚最好的方法是什么。我们应该考虑使用C语言编写文件输入部分,还是另一种策略更有用?(简单地将整个数组预加载到内存中会比一系列顺序读取“块”(兆字节)更好吗? 一些附加说明: 因此,我们主要是在寻找用于后处理的脚本工具,而不是“在线”工具-因此要使用Python。 D = 16林Δ 吨→交通∞⟨ (X(吨+ Δ 吨)- X(吨))2⟩d=1个6林ΔŤ→∞⟨(X(Ť+ΔŤ)-X(Ť))2⟩D = \frac{1}{6} \lim_{\Delta t \rightarrow \infty} \left< \left( {\bf x}(t + \Delta t) - {\bf x}(t) \right)^2 \right>
15 python  c  efficiency 

5
计算
函数具有靠近奇点X = 0。但是,可以提高奇点:对于x = 1,应该使f (x )= 1,因为 e x = ∑ k = 0 x kf:x↦(ex−1)/xf:x↦(ex−1)/xf \colon x \mapsto (e^x-1)/xx=0x=0x = 0x=1x=1x = 1f(x)=1f(x)=1f(x) = 1 因此 (ex−1)/x=∑k=1x k − 1ex=∑k=0xkk!ex=∑k=0xkk! e^x = \sum_{k=0} \frac{x^k}{k!} 然而,形式(ëX-1)/X不仅在没有定义X=0,它也是在该点附近的数值不稳定; 为了在数值上评估非常小的x的f(x),可以使用泰勒展开,即上述幂级数的截断。(ex−1)/x=∑k=1xk−1k!(ex−1)/x=∑k=1xk−1k! (e^x - 1)/x = \sum_{k=1} \frac{x^{k-1}}{k!} (ex−1)/x(ex−1)/x(e^x-1)/xx=0x=0x = 0f(x)f(x)f(x)xxx 问:函数是否有名称?换句话说,这是一个普遍的问题吗?fff 问:是否有人知道可以很好地处理这种情况的C / …
13 c++  c 

4
在频谱规范枪战中(使用gcc,intel和其他编译器),C是否比Fortran慢?
结论如下: Fortran编译器真的好多少? gfortran和gcc对于简单的代码一样快。所以我想尝试一些更复杂的事情。我以频谱规范枪战为例。我首先预先计算2D矩阵A(:, :),然后计算范数。(我认为枪战决不允许这种解决方案。)我已经实现了Fortran和C版本。这是代码: https://github.com/certik/spectral_norm 最快的gfortran版本是Spectrum_norm2.f90和Spectrum_norm6.f90(一个使用Fortran的内置matmul和dot_product,另一个使用代码实现这两个功能-速度没有差异)。我能够编写的最快的C / C ++代码是Spectrum_norm7.cpp。从我的笔记本电脑上的git版本457d9d9开始的时间是: $ time ./spectral_norm6 5500 1.274224153 real 0m2.675s user 0m2.520s sys 0m0.132s $ time ./spectral_norm7 5500 1.274224153 real 0m2.871s user 0m2.724s sys 0m0.124s 因此,gfortran的版本要快一些。这是为什么?如果您使用更快的C实现发送请求请求(或仅粘贴代码),我将更新存储库。 在Fortran中,我传递了一个2D数组,而在CI中,则传递了一个1D数组。随意使用2D阵列或您认为合适的任何其他方式。 对于编译器,让我们比较一下gcc与gfortran,icc与ifort等。(与点选页面不同,点选页面比较了ifort和gcc。) 更新:使用版本179dae2,该版本在我的C版本中改进了matmul3(),它们现在速度一样快: $ time ./spectral_norm6 5500 1.274224153 real 0m2.669s user 0m2.500s sys 0m0.144s $ time ./spectral_norm7 5500 …
13 fortran  c 

1
有没有一种工具可以通过解析Fortran(或C)代码来生成Fortran(或C)函数的间隔扩展?
在我的博士学位论文中,案例研究要求我在CHEMKIN-II中有Fortran子例程的间隔扩展(对此表示歉意;这是我能从Sandia国家实验室不再分发的软件包中找到的最好的)。CHEMKIN-II是用于燃烧化学的化学软件包。因为它是燃烧中使用的标准包装,所以我不能(或者更愿意不使用)。 为了获得所需的间隔扩展,我一直使用内部开发的称为DAEPACK的工具。我以前使用的旧二进制文件能够生成我在32位OS(版本对应于gcc 2.95的libstdc版本)上所需的CHEMKIN-II子例程的所需间隔扩展,但是几年前就淘汰了的使用,这是一个巨大的考验(因为我必须找到我使用的所有其他软件的32位版本)。该软件包的源代码也是专有的,但是由于它最初是由MIT开发的,而我是在MIT工作的,因此我能够(经过大量的努力)获得DAEPACK的源代码。使用我拥有的源代码,我能够编译与64位版本的Linux兼容的DAEPACK版本以及与gcc 4.xx相对应的libstdc版本。但是,我怀疑此源代码已经过时,编译成无法成功生成我需要的区间扩展代码才能完成论文的可执行文件。我已与开发人员联系,以寻求他的修复源代码方面的帮助,但是从以前与开发人员的联系中,我知道如果他愿意的话,修复源代码将花费一些时间。 这是个大问题:我有6个月的时间才能毕业,因为我用光了资金。我不能依靠开发人员足够快地修复DAEPACK,而无法成功完成我的博士学位论文,而这正是你们的用武之地。 我需要执行以下操作的软件包: 生成间隔扩展,泰勒模型(使用间隔算法)以及几乎任意的Fortran 77代码的派生;我认为DAEPACK不能解析的唯一结构是DO循环和IF语句。由于我需要泰勒模型,因此代码还必须具有自动微分(AD)功能。 通过Fortran 77代码的源到源转换生成这些间隔扩展和Taylor模型(即,它像编译器一样解析源代码,以生成计算间隔扩展和Taylor模型的源代码)。 紧急情况下,我可以使用对C代码而不是Fortran 77代码执行上述两项操作的软件,然后将所有内容传递给f2c。我真的不喜欢这样,因为我不知道是否通过所有操作f2c都可以,但是我非常绝望。 你们可以帮助绝望的博士生吗? 在有时间限制的情况下,为了预料到一些可能的建议,以下是对我不起作用的方法: 努力使DAEPACK工作;相信我,我已经尝试过。而且我经常向开发人员投诉。 使用面向对象(或类似于对象的)方法计算区间扩展或泰勒模型的工具。我没有时间用新的类型重新编码CHEMKIN-II(或任何其他类似的大型库)。这个太大了。 使用除Fortran 77/90或C之外的任何其他语言。CHEMKIN-II代码位于Fortran中。我可以使用f2c,也可以根据需要使用CHEMKIN-II的基于Sandia的克隆TChem 将其转换为C。我以前的结果是使用CHEMKIN-II;我的新结果应该复制我的旧结果,并且我已经知道Cantera将不会根据案例研究和单元测试复制CHEMKIN-II的功能。此外,我之前的研究生对CHEMKIN-II源代码进行了一些不可思议的操作,以使区间运算特别有效。对于我来说,很难在其他任何软件包中复制它。

2
是否存在使用本机C99复杂类型的C的ODE求解器的开源集?
我一直在使用GSL作为许多模拟的基础,但出于我的目的,这有点过头了,并且出于遗留原因,它定义了自己的复杂类型。除了编写自己的Runge-Kutta ODE求解器(可能效率不高)外,还有没有使用本机C99复杂类型的开源ODE求解器?
12 c  ode 

3
测试两个12x12矩阵是否具有相同的行列式
给我一个对称的,可逆的,正定的和密集的12×1212×1212 \times 12矩阵QQQ我需要测试其中,J是全1矩阵。det(Q)=det(12I−Q−J)(1)det(Q)=det(12I−Q−J)(1)\det(Q) = \det(12I-Q-J) \; \; (1)JJJ 我目前正在使用armadillo库执行此操作,但事实证明它太慢了。问题是我需要对一万亿个矩阵执行此操作,事实证明,计算这两个行列式是我程序的瓶颈。因此,我有两个问题 给定我的大小,是否可以使用任何技巧更快地计算行列式?在这种情况下,是否可以对12×1212×1212 \times12矩阵进行混乱的扩展? 还有其他有效的方法来检验是否相等(1)(1)(1) 编辑。回答评论。我需要计算所有连接的13阶非自补图GGG,以使G和\ overline {G}具有相同数量的生成树。动机可以在此mathoverflow帖子中找到。对于机器,我正在8核3.4GHh机器上并行运行它。131313GGGG¯¯¯¯G¯\overline{G} 编辑。通过制作一个专门用于计算12×1212×1212 \times 12 × 12矩阵行列式的C程序,我能够将预期运行时间减少50%。仍然欢迎提出建议。

4
在C / C ++中寻找Runge-Kutta八阶
我想在使用Windows机器以C ++编写的天体力学/天体动力学应用程序中使用Runge-Kutta 8阶方法(89)。因此,我想知道是否有人知道有文档记录且可以免费使用的好的库/实现?只要用C编写就可以了,只要不存在任何编译问题即可。 到目前为止,我已经找到了这个库(mymathlib)。该代码似乎还可以,但是我还没有找到有关许可的任何信息。 您能通过揭示一些您可能知道并且适合我的问题的替代方法来帮助我吗? 编辑: 我看到确实没有像我期望的那样有太多的C / C ++源代码。因此,Matlab / Octave版本也可以(仍然必须免费使用)。

3
关于轻量级/无需安装C或C ++的密集线性代数求解器的建议
我的大部分编程都是用C语言编写的一次性研究代码供我自己使用。除了亲密合作者之外,我从未分发过任何代码。我已经开发了一种算法,可以在科学期刊上发表。我想在本文的在线补充中提供源代码,也许还提供可执行代码。一位同事要求我对该算法进行概括,该算法要求我用C ++编写(ack!),并且要求我求解小型密集线性系统。如果我成功获得了该算法的用户基础,则部分原因是使用该算法的输入栏很低(例如在地板上)。潜在的用户不会安装库等来使用代码。我希望代码完全独立,不受任何许可的约束。我可能只是简单地通过从Golub和van Loan中取出一些东西来编写自己的求解器,但是我更愿意使用别人已经写过的香草求解器(如果有的话)。建议表示赞赏。谢谢!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.