我有一个简单的程序,可以执行一些蒙特卡罗算法.使用algorithmn的一次迭代没有副作用,因此我应该能够使用多个线程运行它.所以这是我整个程序的相关部分,用C++ 11编写:
void task(unsigned int max_iter, std::vector<unsigned int> *results, std::vector<unsigned int>::iterator iterator) {
for (unsigned int n = 0; n < max_iter; ++n) {
nume::Album album(535);
unsigned int steps = album.fill_up();
*iterator = steps;
++iterator;
}
}
void aufgabe2() {
std::cout << "\nAufgabe 2\n";
unsigned int max_iter = 10000;
unsigned int thread_count = 4;
std::vector<std::thread> threads(thread_count);
std::vector<unsigned int> results(max_iter);
std::cout << "Computing with " << thread_count << " threads" << std::endl;
int i = 0;
for (std::thread &thread: …Run Code Online (Sandbox Code Playgroud) 我有一个使用Boost和Qt的项目,并使用CMake编译.当我使用cmake … -DCMAKE_RELEASE_TYPE=Release -G ninja它构建它并使用ninja它构建它时,它工作得很好.
要进行UI和调试,我想使用Qt Creator.当我用它打开CMake项目时,它找不到Boost:
-- [ /usr/share/cmake-3.0/Modules/FindBoost.cmake:529 ] _boost_TEST_VERSIONS = 1.56.0;1.56;1.55.0;1.55;1.54.0;1.54;1.53.0;1.53;1.52.0;1.52;1.51.0;1.51;1.50.0;1.50;1.49.0;1.49;1.48.0;1.48;1.47.0;1.47;1.46.1;1.46.0;1.46;1.45.0;1.45;1.44.0;1.44;1.43.0;1.43;1.42.0;1.42;1.41.0;1.41;1.40.0;1.40;1.39.0;1.39;1.38.0;1.38;1.37.0;1.37;1.36.1;1.36.0;1.36;1.35.1;1.35.0;1.35;1.34.1;1.34.0;1.34;1.33.1;1.33.0;1.33
-- [ /usr/share/cmake-3.0/Modules/FindBoost.cmake:531 ] Boost_USE_MULTITHREADED = TRUE
-- [ /usr/share/cmake-3.0/Modules/FindBoost.cmake:533 ] Boost_USE_STATIC_LIBS =
-- [ /usr/share/cmake-3.0/Modules/FindBoost.cmake:535 ] Boost_USE_STATIC_RUNTIME =
-- [ /usr/share/cmake-3.0/Modules/FindBoost.cmake:537 ] Boost_ADDITIONAL_VERSIONS =
-- [ /usr/share/cmake-3.0/Modules/FindBoost.cmake:539 ] Boost_NO_SYSTEM_PATHS =
-- [ /usr/share/cmake-3.0/Modules/FindBoost.cmake:591 ] Declared as CMake or Environmental Variables:
-- [ /usr/share/cmake-3.0/Modules/FindBoost.cmake:593 ] BOOST_ROOT =
-- [ /usr/share/cmake-3.0/Modules/FindBoost.cmake:595 ] BOOST_INCLUDEDIR =
-- [ /usr/share/cmake-3.0/Modules/FindBoost.cmake:597 ] BOOST_LIBRARYDIR =
-- [ /usr/share/cmake-3.0/Modules/FindBoost.cmake:599 …Run Code Online (Sandbox Code Playgroud) 在R中,可以访问列表元素$.当一个人访问一个未包含在列表中的字段时,结果值就是NULL.这在我的代码中我进一步使用对象的部分是有问题的.拿这个代码:
l <- list(foo = 1, bar = 2)
print(l$foobar)
Run Code Online (Sandbox Code Playgroud)
输出只是NULL没有错误,也没有警告.我知道可能需要这样做,以便新元素(l$foobar <- 3)的分配可以工作.
有什么方法可以使列表中的字段的读取访问成为硬错误(如果它不存在)?
对于我的实验室实验,我编写了用我的测量进行计算的程序.目前,这些程序打印出终端中所有数据的简单摘要,如下所示:
U = 2.0 ± 0.1 V
I = 6.0 ± 0.2 A
Run Code Online (Sandbox Code Playgroud)
因为我必须手工编写它们,所以我会用这些来写文本中的值.
从现在开始,我们可以在计算机上创建报告.我在LaTeX中编写我的报告,并希望将程序的结果自动插入到文本中.这样,我可以重新运行程序,而无需将结果复制粘贴到文本中.由于测量和结果非常不同,我想到了使用模板语言.因为我已经使用过Python,所以我想到了Jinja:
article.tex
We measured the voltage $U = \unit{<< u_val >> \pm << u_err >>}{\volt}$ and the
current $I = \unit{<< i_val >> \pm << i_err >>}{\ampere}$. Then we computed the
resistance $R = \unit{<< r_val >> \pm << r_err >>}{\ohm}$.
All our measurements:
\begin{table}[h]
\begin{tabular}{rrr}
$U/\volt$ & $I/\ampere$ \\
\hline
%< for u, i in data: ->%
$<< u >>$ & $<< i >>$ \\ …Run Code Online (Sandbox Code Playgroud) 假设我想用纯 C 语言实现一个数值积分例程。看起来像这样:
double integrate(double (*f)(double), double lower, double upper, double step));
Run Code Online (Sandbox Code Playgroud)
我经常发现函数实际上依赖于多个变量,并且我想对第一个变量进行积分。假设我想整合这个:
double func(double x, double z);
Run Code Online (Sandbox Code Playgroud)
关于x。我无法传递func给,integrate因为它的签名错误。现在我知道了以下解决方法,这些方法是我们在学习数字课程时使用的:
使用C++
我刚刚使用 C++ 和 iststd::bind创建了一个函子(函数对象),我可以将其传递给集成例程。现在我只需使用 lambda 函数来完成它。
在函数中使用 GCC 扩展函数
使用 GCC,您可以在函数中声明函数。所以一个人可以做
// z is set to some value in this function scope here.
double inner(double x) {
return func(x, z);
}
Run Code Online (Sandbox Code Playgroud)
并将其传递inner给integrate函数。这是不标准的,而且感觉不太好。
使用全局变量
的值z可以存储在全局变量中。这将要求该函数可编辑以从全局变量而不是参数中func使用。z那可能是不可能的。然后它也会破坏并发性并且总体来说很糟糕。
是否存在一种方法可以在不破坏某些内容的情况下使用普通 C 进行处理?
我们今天谈到了“fizz buzz”编程测试,我想用 C++ 来实现它,但是用元编程。理想情况下,它会在编译期间生成输出。
我当前的代码使用模板,但它仍然必须执行才能产生输出。在Ideone上查看。
我仍然使用std::cout <<为了在屏幕上打印输出。在FizzBuzz<i>::value将给要么i,-1(嘶嘶声), -2(巴兹),或-3(FizzBuzz)。然后word<value>为负数定义并给出char const *:
template <int i>
struct Print {
static void print() {
Print<i - 1>::print();
auto const value = FizzBuzz<i>::value;
if (value < 0) {
std::cout << word<value>() << std::endl;
} else {
std::cout << value << std::endl;
}
}
};
Run Code Online (Sandbox Code Playgroud)
由于递归,循环消失了,有一个Print<0>可以阻止它。
是否有某种方法可以打印出word<value>()或value,哪些是在编译期间已知的?这可能不适用于每个编译器,因此我对适用于 GCC 和/或 Clang 的解决方案感到满意。
我有一个Haskell程序,它使用Metropolis算法模拟Ising模型.主要操作是模板操作,它在2D中获取下一个邻居的总和,然后将其与中心元素相乘.然后元素可能会更新.
在C++中,我获得了不错的性能,我使用一维数组,然后使用简单的索引算术线性化对它的访问.在过去的几个月里,我已经拿起Haskell来拓宽视野,并尝试在那里实施Ising模型.数据结构只是一个列表Bool:
type Spin = Bool
type Lattice = [Spin]
Run Code Online (Sandbox Code Playgroud)
然后我有一些固定的程度:
extent = 30
Run Code Online (Sandbox Code Playgroud)
以及get检索特定晶格点的函数,包括周期性边界条件:
-- Wrap a coordinate for periodic boundary conditions.
wrap :: Int -> Int
wrap = flip mod $ extent
-- Converts an unbounded (x,y) index into a linearized index with periodic
-- boundary conditions.
index :: Int -> Int -> Int
index x y = wrap x + wrap y * extent
-- Retrieve a single element from the lattice, automatically …Run Code Online (Sandbox Code Playgroud) 有这样一个演讲,CppCon 2016:Chandler Carruth \xe2\x80\x9cGarbage In,Garbage Out:争论未定义的行为...”,其中 Carruth 先生展示了 bzip 代码中的一个示例。他们已将其用作uint32_t i1索引。在 64 位系统中,数组访问block[i1]将执行*(block + i1)。问题是block是 64 位指针,而i1是 32 位数字。加法可能会溢出,并且由于无符号整数已定义溢出行为,因此编译器需要添加额外的指令确保即使在 64 位系统上也确实实现了这一点。
我还想用一个简单的例子来展示这一点。所以我尝试了++i使用各种有符号和无符号整数的代码。以下是我的测试代码:
#include <cstdint>\n\nvoid test_int8() { int8_t i = 0; ++i; }\nvoid test_uint8() { uint8_t i = 0; ++i; }\n\nvoid test_int16() { int16_t i = 0; ++i; }\nvoid test_uint16() { uint16_t i = 0; ++i; }\n\nvoid test_int32() { int32_t i = 0; ++i; }\nvoid …Run Code Online (Sandbox Code Playgroud) 在Sage数学(搜索octahedral)的一个例子中有这样一行:
K.<v> = sage.groups.matrix_gps.finitely_generated.CyclotomicField(10)
Run Code Online (Sandbox Code Playgroud)
这是.<v>做什么的?
我有很多Sphinx页面,它们的链接相同。像那些:
.. _CC-BY: https://creativecommons.org/licenses/by/3.0/
.. _MIT: http://opensource.org/licenses/MIT
Run Code Online (Sandbox Code Playgroud)
目前,每个文件中都有这两行MIT_。在项目中是否可以有一个中央文件,我可以在其中放置那些链接目标?这样,我可以MIT_在任何地方写东西,并且可以链接到那个地方。
c++ ×3
python ×2
assembly ×1
boost ×1
c ×1
c++11 ×1
cmake ×1
currying ×1
fizzbuzz ×1
gcc ×1
haskell ×1
latex ×1
optimization ×1
performance ×1
python-2.7 ×1
qt-creator ×1
r ×1
sage ×1
templates ×1
x86-64 ×1