出于好奇,我决定将我自己的矩阵乘法函数与BLAS实现进行比较......我对结果的评价最少:
自定义实现,1000x1000矩阵乘法的10次试验:
Run Code Online (Sandbox Code Playgroud)Took: 15.76542 seconds.BLAS实施,1000x1000矩阵乘法的10次试验:
Run Code Online (Sandbox Code Playgroud)Took: 1.32432 seconds.
这是使用单精度浮点数.
我的实施:
template<class ValT>
void mmult(const ValT* A, int ADim1, int ADim2, const ValT* B, int BDim1, int BDim2, ValT* C)
{
if ( ADim2!=BDim1 )
throw std::runtime_error("Error sizes off");
memset((void*)C,0,sizeof(ValT)*ADim1*BDim2);
int cc2,cc1,cr1;
for ( cc2=0 ; cc2<BDim2 ; ++cc2 )
for ( cc1=0 ; cc1<ADim2 ; ++cc1 )
for ( cr1=0 ; cr1<ADim1 ; ++cr1 )
C[cc2*ADim2+cr1] += A[cc1*ADim1+cr1]*B[cc2*BDim1+cc1];
}
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
所以我有一个std :: set,它需要保持特定的顺序以及不允许用户定义(由我)类型的重复.现在我可以通过重载我的类型中的'<'运算符来使订单正常工作.但是,该集合没有适当地检测重复,并且说实话,我不完全确定它是如何在内部执行的.我已经重载'=='运算符,但不知何故我不确定这是该集实际使用的是什么?所以问题是当你添加值时,集合如何确定重复?这是相关代码:
用户定义的类型:
//! An element used in the route calculation.
struct RouteElem {
int shortestToHere; // Shortest distance from the start.
int heuristic; // The heuristic estimate to the goal.
Coordinate position;
bool operator<( const RouteElem& other ) const
{
return (heuristic+shortestToHere) < (other.heuristic+other.shortestToHere);
}
bool operator==( const RouteElem& other ) const
{
return (position.x == other.position.x && position.y == other.position.y);
}
};
Run Code Online (Sandbox Code Playgroud)
因此,当元素的位置相等时,元素是等价的,如果元素的组合函数小于另一元素,则元素小于另一元素.排序工作,但该集将接受相同位置的两个元素.
我有一组数字~100,我希望在这个集合上执行MC模拟,基本思路是我完全随机化集合,对前20个值做一些比较/检查,存储结果并重复.
现在实际的比较/检查算法非常快,它实际上在大约50个CPU周期内完成.考虑到这一点,为了优化这些模拟,我需要尽可能快地生成随机集.
目前我正在使用George Marsaglia的Multiply With Carry算法,该算法为我提供了17个CPU周期内的随机整数,非常快.但是,使用Fisher-Yates混洗算法,我必须生成100个随机整数,~1700个CPU周期.这远远超过了我的比较时间.
所以我的问题是有没有其他众所周知/强大的技术来进行这种类型的MC模拟,我可以避免长的随机集生成时间?
我想只是从集合中随机选择20个值,但我必须进行碰撞检查以确保选择了20个唯一条目.
更新:
谢谢你的回复.关于我在帖子之后提出的方法,我还有另外一个问题.问题是,这是否会提供真实的(假设RNG是好的)随机输出.基本上我的方法是设置一个与输入数组长度相同的整数值数组,将每个值设置为零.现在我开始从输入集中随机选择20个值,如下所示:
int pcfast[100];
memset(pcfast,0,sizeof(int)*100);
int nchosen = 0;
while (nchosen<20)
{
int k = rand(100); //[0,100]
if ( pcfast[k] == 0 )
{
pcfast[k] = 1;
r[nchosen++] = s[k]; // r is the length 20 output, s the input set.
}
}
Run Code Online (Sandbox Code Playgroud)
基本上我上面提到的,随机选择20个值,除了它似乎是一种确保没有碰撞的优化方式.这会提供良好的随机输出吗?它很快.
问题:通过const引用传递整数类型是否有益,而不是简单地通过值传递.
即.
void foo(const int& n); // case #1
Run Code Online (Sandbox Code Playgroud)
VS
void foo(int n); // case #2
Run Code Online (Sandbox Code Playgroud)
对于用户定义的类型,答案是明确的,情况#1避免了在确保对象的常量的同时进行不必要的复制.但是在上面的例子中,引用和整数(至少在我的系统上)是相同的大小,所以我无法想象在函数调用需要多长时间方面存在很大差异(由于复印).但是,我的问题实际上与编译器内联函数有关:
对于非常小的内联函数,编译器是否必须在#2的情况下复制整数?通过让编译器知道我们不会更改引用,它可以内联函数调用而无需不必要地复制整数吗?
欢迎任何建议.
我不久前发布了一个问题,关于我的程序本质上是如何泄漏内存的:请看这里.我现在已经专门跟踪了一些代码,其中我将Bitmap对象的原始字节复制到托管数组中.相关代码:
public class FastBitmap
{
...
private byte[] rgbValues;
private int height;
private int width;
private Bitmap image;
public FastBitmap(Bitmap plainBitmap)
{
width = plainBitmap.Width;
height = plainBitmap.Height;
image = new Bitmap(plainBitmap);
LockPixels(new Rectangle(0, 0, image.Width, image.Height));
}
private void LockPixels(Rectangle area)
{
if (locked)
return;
locked = true;
BitmapData bitmapData = image.LockBits(area, ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb);
IntPtr ptr = bitmapData.Scan0;
int stride = bitmapData.Stride;
int numBytes = image.Width * image.Height * 3;
rgbValues = new byte[numBytes];
for (int r …Run Code Online (Sandbox Code Playgroud) 因此,定义DLL的导出/导入的常见(至少VS 2005状态)方式是:
#ifdef MY_EXPORTS
#define MY_API __declspec(dllexport)
#else
#define MY_API __declspec(dllimport)
#endif
class MY_API MyClass {
...
};
Run Code Online (Sandbox Code Playgroud)
如果我只是将我的代码构建为DLL,那么这很有用.但是,我想选择使用静态库或DLL.现在一个明显(但可怕)的解决方案是复制所有代码,删除DLL'MY_API'定义.现在看起来更好的方法是命令行切换来定义或不定义DLL的东西.但是对于静态库,"MY_API"应该是什么?
#ifdef DLL_CONFIG
#ifdef MY_EXPORTS
#define MY_API __declspec(dllexport)
#else
#define MY_API __declspec(dllimport)
#endif
#else
#define MY_API // What goes here?
#endif
class MY_API MyClass {
...
};
Run Code Online (Sandbox Code Playgroud)
现在假设可以这样做,当库的用户包含头文件时会出现问题(即他们是否必须定义'DLL_CONFIG')?
所以我已经用C++编程了将近2年,而且我有幸使用IDE(VS)和可爱的项目设置以及自动链接等.我总是远离任何需要我通过makefile编译的外部库,或者至少是那些用于linux环境/其他编译器的库.
无论如何我现在想要使用一个超级方便的实用程序(Bob Jenkins Perfect Minimal Hash),但它需要我通过makefile编译,不仅如此,而是使用g ++编译器.
我继续前进并获得了mingW32-make实用程序,现在正试图让它工作.我现在在哪里:
我得到的错误是:
C:\ gen_progs\pH值>的mingw32-MAKE
mingw32-make:***没有规则来制作目标
lookupa.c', needed bylookupa.o'.停止.
和makefile本身:
CFLAGS = -O
.cc.o:
gcc $(CFLAGS) -c $<
O = lookupa.o recycle.o perfhex.o perfect.o
const64 : $(O)
gcc -o perfect $(O) -lm
# DEPENDENCIES
lookupa.o : lookupa.c standard.h lookupa.h
recycle.o : recycle.c standard.h recycle.h
perfhex.o : perfhex.c standard.h lookupa.h recycle.h perfect.h
perfect.o : perfect.c standard.h lookupa.h recycle.h perfect.h
Run Code Online (Sandbox Code Playgroud)
现在错误似乎是合理的,至少从我对makefile的最小理解,我有所有引用的.c,.h文件,但是我没有.o文件,似乎没有关于如何制作的任何说明这些.所以我的问题是:
我调用make实用程序错了吗?或者我是否需要先编译目标文件?或者......我需要在make文件中添加一些内容吗?
我再次提到所有引用的.c和.h文件.
编辑:对不起,我实际上错过了那个特定的文件似乎已经消失了.但是,将其添加回来就是我现在得到的错误:
c:\gen_progs\ph>mingw32-make
cc -O -c -o …Run Code Online (Sandbox Code Playgroud) 对不起,如果标题有点神秘.基本上我在ac#forms app中创建缩放控件,我的想法是我可以按因子缩放图像,即.1x,2x,4x,8x.我需要图像保持像素化,即.最近的邻居.缩放工作非常有效,除了当我使用边界像素选择Interp模式作为最近邻居时,它默认为内部颜色.这就是说外部像素看起来像内部像素的宽度的一半,问题实际上是当我添加一个工具提示来显示当前moused-over像素的x,y坐标时,它被抛出关闭.要清楚,它被抛弃的原因是因为我将当前像素计算为:
void m_pictureBox_MouseMove(object sender, MouseEventArgs e)
{
int x = e.Location.X / m_zoomFactor;
int y = e.Location.Y / m_zoomFactor;
}
Run Code Online (Sandbox Code Playgroud)
而且因为外部像素是宽度的一半......所以你得到了图片.
绘图代码很简单:
void m_pictureBox_Paint(object sender, PaintEventArgs e)
{
if (m_pictureBox.Image!=null)
{
e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
e.Graphics.ScaleTransform((float)m_zoomFactor, (float)m_zoomFactor);
e.Graphics.DrawImage(m_pictureBox.Image, 0, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
图片控件托管在我的自定义"ZoomControl"中,它本身继承自"Panel"控件.
我的问题基本上是,任何正文可以帮助我解决边界像素问题,还有更好的方法来获得缩放功能吗?
我正在实现一个n维数组类,它是一个模板如下(请注意,数据存储在一个线性数组中,其长度是所有维度的乘积):
template< class valType, int rank >
class NDimensionalArray
{
public:
private:
valType* m_data;
int* m_dimensions;
int m_rank;
};
Run Code Online (Sandbox Code Playgroud)
所以我的想法是用户(我)可以指定排名2和某个维度的数组,即:
NDimensionalArray<double,2> matrix(10,10);
Run Code Online (Sandbox Code Playgroud)
现在困难在于专门构造1-> n维的构造函数,每个构造函数需要n个参数,其中n是数组的等级.现在我想到使用像printf()中使用的valarray,但是这个定义了一个具有2维的1维数组,即:
NDimensionalArray<double,1> matrix(10,10);
Run Code Online (Sandbox Code Playgroud)
是完全可以接受的行为.我可以使用一些巧妙的技巧让编译器重复吗?实际上只要我知道排名,并且具有每个维度的长度,构造函数就可以是通用的:
{
int nElements = m_dimensions[0];
for ( int i=1 ; i<m_rank ; ++i )
nElements *= m_dimensions[i];
m_data = new valType[nElements];
}
Run Code Online (Sandbox Code Playgroud)
编辑:请注意,访问者将需要类似的操作.
此外,我已经考虑了一个构造函数的选项,看起来像:
NDimensionalArray( const NDimensionalArray<int,1>& dimensions );
Run Code Online (Sandbox Code Playgroud)
可以使用如下:
NDimensionalArray<int,1> dimVec(2); // Need a specification for 1-dimensional arrays.
dimVec(0) = 10;
dimVec(1) = 10;
NDimensionalArray<double,2> matrix(dimVec);
Run Code Online (Sandbox Code Playgroud)
这将是一个可行的解决方案,但与我想要的用途相比它很难看.访问多维数组也会变得非常痛苦,并且必须为每次访问构建维度向量非常慢.
所以我有点困惑,我一直在寻找一种适合从我自己的类型继承std :: exception的方法.现在根据cplusplus.com(我知道这不一定是标准,这就是我要问的原因),std :: exception是一个没有成员的基类.但是,在查看我的标准库(VS 2005)的实现之后,使用两个成员变量明确定义了类std :: exception:
class _CRTIMP_PURE exception
{ // base of all library exceptions
...
private:
const char *_m_what;
int _m_doFree;
};
Run Code Online (Sandbox Code Playgroud)
现在是这个标准让这些成员包含在基类std :: exception中,我的理解是它不是.我的理由是我的派生异常类实际上只需要一个字符串来获取它的信息,因此这个实现可以正常工作.但是,我担心这是非标准的,因此我最好继承std :: exception并自己添加适当的成员+复制/赋值代码.
所以我对WPF很新,并认为作为一种学习经验,我将在WPF中实现一个简单的关卡编辑器.编辑器的目的是双重的.首先,我希望能够将任意方向的边界框定义为关卡中的"实体"区域.然后我希望能够放置,调整大小,倾斜图像.

我已经实现了使用Canvas绘制定向边界框的功能(参见上图)."画布"和工具栏位于停靠面板中.我现在正计划实现图像功能.我想做的是为每一层图像创建另一个Canvas图层(可能很多).这样做的原因是我可以轻松限制每个图层的选择和可见性.但是我不确定如何正确地分层多个画布控件.当然我正在使用的DockPanel容器不允许我有多个控件在彼此之上.我想将我的Canvas图层嵌入到另一个画布中,但我不知道如何正确设置它(请注意,设置应该是动态的代码,因为我希望允许用户根据需要添加更多图层).
理想的最终结果是具有透明背景的任意数量的层(因此我们可以看到后面的层)并且可以容易地隐藏它们.一次只有一层接收用户输入.
所以我的问题是,他们是一个更合适的方法而不是分层画布吗?如果画布的分层是一个很好的方法,有人可以提供链接/示例代码,以便如何设置.多个堆叠控件的最佳容器是什么(请注意子画布大小应与父容器匹配).
干杯!