假设有两个任意时间戳记:
uint32_t timestamp1;
uint32_t timestamp2;
Run Code Online (Sandbox Code Playgroud)
除了转换为更大的带符号类型的明显变体和相当冗长的if-else之外,是否有一种标准的一致方式来获得两者的带符号区别。
事先不知道哪一个较大,但是已知差异不大于最大20位,因此它将适合32位带符号。
int32_t difference = (int32_t)( (int64_t)timestamp1 - (int64_t)timestamp2 );
Run Code Online (Sandbox Code Playgroud)
该变体的缺点是硬件可能不支持使用64位算术,并且只有存在较大的类型时(当然,时间戳已经是64位),这当然是可能的。
其他版本
int32_t difference;
if (timestamp1 > timestamp2) {
difference = (int32_t)(timestamp1 - timestamp2);
} else {
difference = - ((int32_t)(timestamp2 - timestamp1));
}
Run Code Online (Sandbox Code Playgroud)
非常冗长,涉及条件跳转。
那是
int32_t difference = (int32_t)(timestamp1 - timestamp2);
Run Code Online (Sandbox Code Playgroud)
从标准的角度来看,这是否可以保证正常工作?
对于家庭项目,我需要将(x,y)坐标绘制到400x400黑白位图上.
在OS X,Windows,Linux上,你最容易重复的是什么样的perl模块以及什么样的图像格式(GIF?,PNG?其他?)?
编辑 我的解决方案,基于GD,由Brian Agnew推荐
use strict;
use warnings;
use GD;
my $BitMap = GD::Image->new(400,400);
my $white = $BitMap->colorAllocate(255,255,255);
my $black = $BitMap->colorAllocate(0,0,0);
# Frame the BitMap
$BitMap->rectangle(0,0,399,399,$black);
# Transparent image, white background color
$BitMap->transparent($white);
# plot some, just to show it works #
for my $x (0..100) {
for my $y (0 .. 100) {
$BitMap->setPixel(250+100*sin($x)-$y,150+125*cos($x)+$y,$black);
}
}
# write png-format to file
open my $fh,">","test.png" or die "$!";
binmode $fh;
print $fh $BitMap->png;
close($fh);
Run Code Online (Sandbox Code Playgroud)
我将一些代码从windows(vs2010)移植到gcc
一块看起来像:
double r1 /* = some value */;
double r2 /* = some value */;
double diff = abs(r1-r2);
std::cerr<< r1 << ", " << r2 << ", " << diff<< std::endl;
Run Code Online (Sandbox Code Playgroud)
它编译在gcc(arm-linux-gnueabihf-g ++(Raspbian 6.3.0-18 + rpi1 + deb9u1)6.3.0 20170516),-Wall -Wextra没有任何警告.
结果是:
0.121, 0.0709839, 0
0.015, 0.131958, 0
0.015, 0.00799561, 0
0.21, 0.00799561, 0
0.182, 0.205994, 0
0.015, 0.00799561, 0
Run Code Online (Sandbox Code Playgroud)
在Windows上,结果是正确的.功能有双重载荷abs.
我不是using namespace std;.似乎在gcc下这些重载在全局命名空间中不存在.
我不知道标准究竟是什么意思,但我希望至少有关于将差异传递给abs函数的double-> int-conversion的警告.
我错过了什么吗?为什么我没有得到这个警告?
我有一个时间离散信号,可能包含许多缺失值。我想对其进行傅里叶变换。
我该怎么做才能正确处理它们?
下图可能显示这种情况
signalpresence x x x x x x x x x x x x x x x x x x x x x
timesteps ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Run Code Online (Sandbox Code Playgroud)
缺失值是周期性的,因为它们来自图像传感器的帧间隙,行频率高于实际图像高度。
将缺失值设置为零会导致输出失真。
是否有一个处理时间/值对的库?
(当然它也必须快:-))
我正在与Numpy一起处理图像处理问题,我正在尝试避免循环并执行以下操作:
我有一个Dims矩阵M NxNxKxK(它是矩阵KxK的矩阵NxN),对于每一行,我希望乘以(点积)行中的所有N个矩阵(KxK).因此,如果我在完整的M(所有行)上执行此操作,我得到矩阵的向量V(Nx1)(KxK),其中V [i]保持M [i,0] xM [i,1]的点积]×... XM [I,N-1].
我使用循环实现了这个问题的解决方案,我无法找到一种没有循环的方法.
实现(带循环):
a = np.array([[1,1,1], [1,1,1], [1,1,1]])
mat = np.array([[a,a,a,a], [a*2,a*2,a*2,a*2], [a*3,a*3,a*3,a*3],
[a*4,a*4,a*4,a*4]]) # the original matrix
N, N, k, k = mat.shape
result = np.ones((N, k, k)) # resulting matrix
for i in range(N):
k = functools.reduce(np.dot, mat[i,:])
result[i,:] = k
print(result)
Run Code Online (Sandbox Code Playgroud) 最近我注意到一些编写"if"语句的程序员的风格倒退.也就是说,在测试中,他们首先将常量值,然后是他们正在测试的变量.例如,他们写道:
bar = foo();
if (MY_CONSTANT == bar) {
/* then do something */
}
Run Code Online (Sandbox Code Playgroud)
对我而言,这使代码难以阅读.因为我们真的在讨论测量变量"bar"的值而不是所有等于"MY_CONSTANT"的变量,所以我总是把变量放在第一位.它是一种未说出口的语法.
无论如何,我看到一些程序员总是以相反的顺序执行此操作.此外,我在过去几年中才注意到这一点.我已经用C语言编程了超过25年,直到比如说过去4年左右我才看到这个.所以我的问题是:
人们有没有理由这样做,如果是这样的话是什么?这是某些语言或项目的通用标准,还是在某些大学教授?还是只有少数人试图与众不同?
我创建一个图像并填充像素:
img = Image.new( 'RGB', (2000,2000), "black") # create a new black image
pixels = img.load() # create the pixel map
for i in range(img.size[0]): # for every pixel:
for j in range(img.size[1]):
#do some stuff that requires i and j as parameter
Run Code Online (Sandbox Code Playgroud)
这可以做得更优雅(并且可能更快,因为从理论上讲,循环可以并行化)?
是否有可能使用具有自定义斜率点断点的非线性标度?例如:我希望y标度的一半显示范围[0:1],另一半显示[1:5],我不想使用对数标度.
最好的是提供映射功能的可能性.当然可以直接映射功能结果,但实验室不适合实际数据.
有可能吗?我搜索了一下,但我不确定我是否错过了什么或者是否不可能.
我有一个QGraphicsEllipseItem我想移动并在移动时触发信号的功能。所以我子类QGraphicsEllipseItem 和QObject并推翻了itemChange触发信号的方法。一切似乎都有效,但是报告的位置似乎与该项目的旧位置有关。即使询问项目的位置似乎也只能检索相对坐标。
这是一些代码来说明我做了什么:
class MyGraphicsEllipseItem: public QObject, public QGraphicsEllipseItem
{
Q_OBJECT
public:
MyGraphicsEllipseItem(qreal x, qreal y, qreal w, qreal h, QGraphicsItem *parent = 0, QGraphicsScene *scene = 0)
:QGraphicsEllipseItem(x,y,w,h, parent, scene)
{}
QVariant itemChange(GraphicsItemChange change, const QVariant &value);
signals:
void itemMoved(QPointF p);
};
QVariant MyGraphicsEllipseItem::itemChange( GraphicsItemChange change, const QVariant &value )
{
// value seems to contain position relative start of moving
if (change == ItemPositionChange){
emit itemMoved(value.toPointF());
}
return QGraphicsEllipseItem::itemChange(change, value); // …Run Code Online (Sandbox Code Playgroud) 我不明白这个指标/规则的原因:
不应从超过 5 个不同的函数中调用一个函数。同一函数内的所有调用均计为 1。该规则仅限于翻译单元范围。
在我看来,这完全不直观,因为这与代码重用以及将代码拆分为常用函数而不是重复代码的方法相矛盾。
有人可以解释其原理吗?