标准美国键盘布局(称为QWERTY)有许多替代键盘.
一些例子包括Dvorak,(和程序员Dvorak等变体),Colemak,AZERTY,Workman布局等.
这些中的任何一个都可以为打字速度,准确性或手/手腕健康带来好处吗?
如果是这样的话,如果我经常编程,我应该选择哪一个作为触摸打字员呢?
我试图了解以下代码段的工作原理.该程序使用SIMD向量指令(Intel SSE)来计算4个浮点数的绝对值(因此,基本上,矢量化的"fabs()"函数).
这是片段:
#include <iostream>
#include "xmmintrin.h"
template <typename T>
struct alignas(16) sse_t
{
T data[16/sizeof(T)];
};
int main()
{
sse_t<float> x;
x.data[0] = -4.;
x.data[1] = -20.;
x.data[2] = 15.;
x.data[3] = -143.;
__m128 a = _mm_set_ps1(-0.0); // ???
__m128 xv = _mm_load_ps(x.data);
xv = _mm_andnot_ps(a,xv); // <-- Computes absolute value
sse_t<float> result;
_mm_store_ps(result.data, xv);
std::cout << "x[0]: " << result.data[0] << std::endl;
std::cout << "x[1]: " << result.data[1] << std::endl;
std::cout << "x[2]: " << result.data[2] << std::endl; …Run Code Online (Sandbox Code Playgroud) 在拼命尝试从Matlab切换到python时,我遇到了以下问题:
在Matlab中,我能够定义一个矩阵,如:
N = [1 0 0 0 -1 -1 -1 0 0 0;% A
0 1 0 0 1 0 0 -1 -1 0;% B
0 0 0 0 0 1 0 1 0 -1;% C
0 0 0 0 0 0 1 0 0 -1;% D
0 0 0 -1 0 0 0 0 0 1;% E
0 0 -1 0 0 0 0 0 1 1]% F
Run Code Online (Sandbox Code Playgroud)
然后可以通过以下方式计算合理基础nullspace(内核):
K_nur= null(N,'r')
Run Code Online (Sandbox Code Playgroud)
和标准正交基础如下:
K_nuo= null(N)
Run Code Online (Sandbox Code Playgroud)
这输出如下:
N =
1 …Run Code Online (Sandbox Code Playgroud) 假设您有一个具有私有成员的类,这些成员在程序中被大量访问(例如在一个必须快速的循环中).想象一下,我已经定义了这样的东西:
class Foo
{
public:
Foo(unsigned set)
: vari(set)
{}
const unsigned& read_vari() const { return vari; }
private:
unsigned vari;
};
Run Code Online (Sandbox Code Playgroud)
我想这样做的原因是,一旦创建了类,"vari"就不应再被改变了.因此,为了最大限度地减少错误发生,"当时似乎是一个好主意".
但是,如果我现在需要数百万次调用此函数,我想知道是否有开销和减速而不是简单地使用:
struct Foo
{
unsigned vari;
};
Run Code Online (Sandbox Code Playgroud)
那么,我是第一个使用类的第一个impule,以避免任何人在构造函数设置后错误地更改变量的值?此外,这是否以函数调用开销的形式引入"惩罚".(假设我在编译器中使用优化标志,例如GCC中的-O2)?
假设我有一个非常大的数组,我希望用MPI(v1)发送或接收.为了索引这个数组,我使用无符号长整数.
现在,我看到的所有MPI函数调用都使用int类型作为它们的"count"参数,例如在这个例子中:
MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status)
Run Code Online (Sandbox Code Playgroud)
但是,如果在我的实现中,我需要能够发送/接收大于int可以容纳的最大数量的数组?当我尝试将无符号整数提供给"count"参数时,编译器自然会给出"无效转换"错误.我想过做一个演员,但后来我担心这会缩小我的变量,所以我有点不知所措.
关于我之前的一个问题的后续问题,已得到完美答复.为了快速回顾一下,我在创建一个拥有巨大数组的类时遇到了麻烦(堆栈溢出错误).在答案中,一些用户建议我使用std :: vector代替.
读入数据的功能如下所示:
Test()
{
memset(myarray, 0, sizeof(myarray));
FILE* fstr = fopen("myfile.dat", "rb");
size_t success= fread(myarray, sizeof(myarray), 1, fstr);
fclose(fstr);
}
Run Code Online (Sandbox Code Playgroud)
对于看起来像这样的myarray:
int myarray[45000000];
Run Code Online (Sandbox Code Playgroud)
我的问题是:我怎样才能把它读成一个更好的:
std::vector<int> myvector;
Run Code Online (Sandbox Code Playgroud)
我搜索了谷歌,并找到了多个答案,通常指向以下代码:
std::ifstream input("myfile.dat", std::ios::in | std::ifstream::binary);
std::copy(std::istream_iterator<int>(input),
std::istream_iterator<int>(),
std::back_inserter(myvector));
Run Code Online (Sandbox Code Playgroud)
在实现之后,当调用myvector.size()时,我得到16(无论出于何种原因),并且访问向量元素会导致出现向量边界的立即崩溃.
那么我该怎么做才能做到这一点?我曾经读过某个地方,我可以简单地使用"旧"方法,然后将数组读入矢量,但这似乎首先打败了使用矢量的目的.
在我的编程中,我需要创建一个用户定义数量的ublas向量.我想这样做
"的std ::生成".但是我遇到编译错误,这使我无法做到.
我使用的代码是这样的:
for (size_t a_= 0; a_ < p_; a_++)
{
ublas::vector<double> next_vhat(size_of_vec);
std::generate(next_vhat.begin(), next_vhat.end(), mygen.give_rnd);
v_hat_.push_back(next_vhat);
}
Run Code Online (Sandbox Code Playgroud)
我不得不std::generate为函数调用创建一个专门的函数,因为class不允许我使用带参数的函数作为第三个参数("gen",参见这里.我需要数字是正态分布的,所以函数调用分布函数必须包含随机数生成器作为参数.因为它不允许我用参数调用它,所以我必须写一个类来为我做这个.
我写的课是这样的:
class RandGen
{
public:
RandGen()
: generator()
, norm_dist(0.0,1.0)
, random_seed(static_cast<unsigned>(std::time(NULL)))
{}
double give_rnd() { return (double) norm_dist(generator); }
private:
base_gen_t generator;
boost::random::normal_distribution<double> norm_dist; //Standard normal distribution
unsigned random_seed;
};
Run Code Online (Sandbox Code Playgroud)
在尝试编译整个事情时,我收到以下错误:
error: cannot convert ‘RandGen::give_rnd’ from type ‘double (RandGen::)()’ to type ‘double (RandGen::*)()’
Run Code Online (Sandbox Code Playgroud)
我不知道编译器要我在这里做什么,或者为什么它在这方面有这么多麻烦.任何建议都非常感谢.
boost库(在C++ 11标准之前)提供了对线程的支持.作为其支持的一部分,它还提供了"障碍"的实现,这是一个允许同步的简单类.引用boost网站:
"屏障是一个简单的概念.也称为集合点,它是多个线程之间的同步点.屏障配置为特定数量的线程(n),当线程到达屏障时,它们必须等到所有n个线程一旦第n个线程到达屏障,所有等待的线程都可以继续,并且屏障被重置."
屏障(等待)的主要功能的实现,如Boost 1.54,如下所示:
bool wait()
{
boost::mutex::scoped_lock lock(m_mutex);
unsigned int gen = m_generation;
if (--m_count == 0)
{
m_generation++;
m_count = m_threshold;
m_cond.notify_all();
return true;
}
while (gen == m_generation)
m_cond.wait(lock);
return false;
}
Run Code Online (Sandbox Code Playgroud)
可以看出,屏障是可重复使用的:一旦建成,它在首次使用后不需要被销毁.
我现在的问题是:变量m_generation是什么?我假设boost库的编写者有理由将其包含在内.每次屏障重置/准备重复使用时它会递增,但到底是什么?它是一个私有变量,因此无法从外部读出.使用wait()函数中的简单内部bool变量可以很容易地解决同样的问题,而不需要私有类变量.