小编Jus*_*tin的帖子

FFTW与Matlab FFT

我在matlab中心发布了这个,但没有得到任何回复所以我想我会转发到这里.

我最近在Matlab中编写了一个简单的例程,它在for循环中使用FFT; FFT主导了计算.我在mex中编写了相同的例程仅用于实验目的,它调用了FFTW 3.3库.事实证明,对于非常大的数组,matlab例程比mex例程运行得更快(大约快两倍).mex例程使用智慧并执行相同的FFT计算.我也知道matlab使用FFTW,但它们的版本是否可能稍微优化一下?我甚至使用了FFTW_EXHAUSTIVE标志,它对大型数组的速度仍然是MATLAB的两倍.此外,我确保我使用的matlab是单线程的"-singleCompThread"标志,我使用的mex文件不在调试模式.只是好奇,如果是这种情况 - 或者如果有一些优化,matlab正在使用我不知道的引擎盖.谢谢.

这是mex部分:

void class_cg_toeplitz::analysis() {
// This method computes CG iterations using FFTs
    // Check for wisdom
    if(fftw_import_wisdom_from_filename("cd.wis") == 0) {
        mexPrintf("wisdom not loaded.\n");
    } else {
        mexPrintf("wisdom loaded.\n");
    }

    // Set FFTW Plan - use interleaved FFTW
    fftw_plan plan_forward_d_buffer;    
    fftw_plan plan_forward_A_vec;       
    fftw_plan plan_backward_Ad_buffer;
    fftw_complex *A_vec_fft;
    fftw_complex *d_buffer_fft;
    A_vec_fft = fftw_alloc_complex(n);
    d_buffer_fft = fftw_alloc_complex(n);

    // CREATE MASTER PLAN - Do this on an empty vector as creating a plane 
    // with FFTW_MEASURE will erase the …
Run Code Online (Sandbox Code Playgroud)

c++ matlab mex fftw

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

Python“三胞胎”字典?

如果有(a1, b1)(a2, b2)使用字典来存储对应关系很容易:

dict[a1] = b1
dict[a2] = b2
Run Code Online (Sandbox Code Playgroud)

我们可以得到(a1, b1)(a2, b2)返回没有问题。

但是,如果我们有(a1, b1, c1)(a2, b2, c2),是否有可能得到类似的信息:

dict[a1] = (b1, c1)
dict[b1] = (a1, c1)
Run Code Online (Sandbox Code Playgroud)

我们在哪里可以使用a1b1来取回三联体(a1, b1, c2)?那有意义吗?我不太确定该问题要使用哪种数据类型。上面的方法可以工作,但是会有重复的数据。

基本上,如果我有一个三元组,可以使用哪种数据类型,以便可以使用第一个或第二个值来取回三元组?

python

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

i = i ++; 未定义.i = foo(i ++)也未定义吗?

例如:

int foo(int i) { return i; }

int main()
{
  int i = 0;

  i = i++;      // Undefined
  i = foo(i++); // ?

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当前的ISO C++标准将针对此案例指定什么?

编辑:

这是我感到困惑的地方:

除非另有说明,否则对单个运算符的操作数和单个表达式的子表达式的评估是不确定的.

如果对标量对象的副作用相对于同一标量对象的另一个副作用或使用相同标量对象的值进行的值计算未被排序,并且它们不可能是并发的(1.10),则行为未定义.

在所有情况下,在右和左操作数的值计算之后,以及在赋值表达式的值计算之前,对赋值进行排序.

调用函数(包括其他函数调用)中的每个评估(在执行被调用函数的主体之前或之后没有特别排序)对于被调用函数的执行是不确定地排序的.

因此,似乎你可以在赋值的左侧进行值计算(只是i),并且右侧的副作用(ifrom 的修改i++)不会相互排序.

编辑2:

对于那些发现自己的人来说,我在这里找到关于测序的非常好的解释.

c++ undefined-behavior

16
推荐指数
2
解决办法
1229
查看次数

id-expression究竟是什么?

我有一个问题,清楚地了解究竟是什么id-expression.我将从最初的C++标准工作草案开始,遵循以下内容:

在此输入图像描述

冒险定义identifier:

标识符是任意长的字母和数字序列.

因此,似乎任意长的字母和数字序列都可以是一个id-expression,但等待:

在此输入图像描述

所以identifier必须先声明它才能成为一个id-expression?那么让我们来看看第7条:

在此输入图像描述

继续...

在此输入图像描述

继续......

在此输入图像描述

我们到达这里:

在此输入图像描述

我将此解释为id-expression需要identifier声明需要的声明id-expression.这似乎是一个循环定义.谁能告诉我哪里出错了?

无论如何,我的解释是必须首先声明标识符才能将其视为一个标识符id-expression,但这不是真的只是一个标识符name吗?该标准规定:

表示实体的每个名称都由声明引入.

那么为什么不把它称之为呢name-expression

c++ language-lawyer

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

Contourf和NaNs(如何使白色区域透明)

我正在尝试contourf绘制图,但数据数组的某些区域具有NaN(仅在数据矩阵中,x和y网格网格矩阵已满).我希望这些NaN是透明的,它们用于矩形边界上的NaN.但是,数据矩阵内的连续NaN区域是白色而不是透明的.以下是一个例子:

码:

[X Y] = meshgrid(10:50);
Z = X.*Y;
Z(10:30,10:30) = NaN;
figure
imshow(uint8(repmat(1:4:240,[60,1,3])));
hold on;
contourf(X,Y,Z);
colormap jet;
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

暗示:

附加上述代码:

% Find Face
set(findobj(h,'FaceColor',[1 1 1]),'FaceAlpha',0))
Run Code Online (Sandbox Code Playgroud)

将找到白色补丁对象并将其设置为透明.不幸的是,下面的补丁已经满了:

在此输入图像描述

更新:拍摄NaN区域并叠加背景图像会导致:

在此输入图像描述

你可以看到它并没有覆盖整个图像.如果我使用imdilate它摆脱白色区域,但同时也破坏黑色边框以及一点点数据.

matlab image

13
推荐指数
2
解决办法
4461
查看次数

如何让QGraphicsItem显示QGraphicsScene中的背景?

在a中QGraphicsScene,我有一个背景设置,上面有几个QGraphicsItems.这些图形项具有任意形状.我想制作另一个QGraphicsItem,即一个圆圈,当放置在这些项目上时,它将基本上显示此圆圈内的背景,而不是填充颜色.

它有点像在photoshop中有一个多层的背景.然后,使用圆形选框工具删除背景顶部的所有图层以显示圆圈内的背景.

或者,另一种查看方式可能是设置不透明度,但此不透明度会直接影响其下方的项目(但仅限于椭圆内)以显示背景.

qt qgraphicsitem qgraphicsscene

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

以下是否真的违反了ODR?

这里:

struct piecewise_construct_t {};
constexpr piecewise_construct_t piecewise_construct = {};

const int magic_number = 42;

inline std::tuple<int> make_magic() {
return std::tuple<int>( piecewise_construct, magic_number );
}
Run Code Online (Sandbox Code Playgroud)

此函数违反ODR([basic.def.odr]§3.2/ 6)两次,因为构造函数2参数都没有接收到左值到右值的转换.因此它们通过地址传递,但地址取决于TU,因为const(和constexpr)意味着内部链接.

我最初认为它确实如此,但问题是magic_number内部联系.由于它具有内部联系,它不会基本上将magic_number它们视为不同翻译单元中的不同变量,因此不是同一变量的多个定义吗?有人可以通过使用C++标准的最新工作草案的引用来指定这个吗?

c++ static inline one-definition-rule language-lawyer

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

EOF象征性常数

来自C编程语言:

int c;
while ((c = getchar()) != EOF)
    putchar(c);
Run Code Online (Sandbox Code Playgroud)

"......解决方案是getchar在没有更多输入时返回一个独特的值,一个不能与任何真实字符混淆的值.这个值被称为EOF"文件结束".我们必须声明c是一个类型大足以容纳任何getchar返回的价值.我们不能使用,char因为除了任何可能之外c必须足够大."EOFchar

我签到stdio.h并在我的系统上打印了EOF的值,然后设置为-1.在我的系统上,chars已签名,但我知道这是依赖于系统的.所以,EOF可以适合char我的系统.我通过定义c为a 重写了上面的小例程,char程序按预期工作.还有ASCII字符表中的字符这里,似乎有对应于看起来像行事255空白字符EOF.

那么,为什么看起来ASCII有一个为EOF指定的字符(255)?这似乎与The C Programming Language一书中的内容相矛盾.

c eof

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

Openmp线程分歧?

术语线程分歧用于CUDA; 根据我的理解,这是一种情况,其中分配了不同的线程来执行不同的任务,这导致了巨大的性能损失.

我想知道,在openmp中这样做有类似的惩罚吗?例如,假设我有一个6核处理器和一个包含6个线程的程序.如果我有条件使3个线程执行某个任务,然后让其他三个线程执行完全不同的任务,那么会有很大的性能损失吗?我想在本质上它是使用openmp来做MIMD.

基本上,我正在用openmp和CUDA编写程序.我希望两个线程运行CUDA内核,而另一个线程运行C代码.谢谢.

multithreading cuda openmp

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

Qt mousemoveevent + Qt :: LeftButton

快速问题,为什么:

void roiwindow::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{ 
    QGraphicsScene::mouseMoveEvent(event);
    qDebug() << event->button();
}
Run Code Online (Sandbox Code Playgroud)

当我在图形中移动光标的同时按住鼠标左键时,返回0而不是1.反正有没有让它返回1所以我可以告诉用户何时在图形切片上拖动鼠标.谢谢.

qt mouseevent qgraphicsscene

5
推荐指数
2
解决办法
6034
查看次数