小编JD8*_*121的帖子

比较Python,Numpy,Numba和C++进行矩阵乘法

在我正在研究的程序中,我需要重复乘以两个矩阵.由于其中一个矩阵的大小,这个操作需要一些时间,我想看看哪种方法最有效.矩阵的尺寸(m x n)*(n x p)在哪里m = n = 310^5 < p < 10^6.

除了我认为使用优化算法的Numpy之外,每个测试都包含矩阵乘法的简单实现:

矩阵乘法

以下是我的各种实现:

蟒蛇

def dot_py(A,B):
    m, n = A.shape
    p = B.shape[1]

    C = np.zeros((m,p))

    for i in range(0,m):
        for j in range(0,p):
            for k in range(0,n):
                C[i,j] += A[i,k]*B[k,j] 
    return C
Run Code Online (Sandbox Code Playgroud)

NumPy的

def dot_np(A,B):
    C = np.dot(A,B)
    return C
Run Code Online (Sandbox Code Playgroud)

Numba

代码与Python代码相同,但它在使用之前及时编译:

dot_nb = nb.jit(nb.float64[:,:](nb.float64[:,:], nb.float64[:,:]), nopython = True)(dot_py)
Run Code Online (Sandbox Code Playgroud)

到目前为止,每个方法调用已使用timeit模块定时10次​​.保持最好的结果.使用矩阵创建矩阵np.random.rand(n,m).

C++

mat2 dot(const mat2& m1, …
Run Code Online (Sandbox Code Playgroud)

c++ python optimization numpy numba

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

WinAPI:正确地将 HBITMAP 复制到剪贴板

我在尝试将 a 复制HBITMAP到剪贴板时遇到了一些困难。我HBITMAP是从一个COLORREF数组创建的,我能够正确显示它。这是它的创建方式:

COLORREF* colors = new COLORREF[imageSize[0] * imageSize[1]];

for (int i = 0; i < imageSize[1]; i++) {
    for (int j = 0; j < imageSize[0]; j++) {
        colors[imageSize[0] * i + j] = RGB(/* ... */);
    }
}

// Create bitmap
HBITMAP hBitmap = CreateBitmap(imageSize[0], imageSize[1], 1, 32, (void*)colors);

delete[] colors;
Run Code Online (Sandbox Code Playgroud)

为了将我的位图复制到剪贴板,我使用了一小段代码:

OpenClipboard(hWnd);
EmptyClipboard();

SetClipboardData(CF_BITMAP, hBitmap);

CloseClipboard();
Run Code Online (Sandbox Code Playgroud)

当我执行我的应用程序时,我可以复制位图并将其粘贴到某处,例如在 MS Paint 中。但是如果我再次尝试复制它,除非再次执行上面的第一段代码,否则无法再粘贴剪贴板内容。

MSDN 文档中,据说

如果 SetClipboardData 成功,则系统拥有由 hMem 参数标识的对象。

我不明白这到底是什么意思,但我想这是我问题的根源。我发现它做什么,我希望有一个函数的例子 …

c++ winapi bitmap

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

标签 统计

c++ ×2

bitmap ×1

numba ×1

numpy ×1

optimization ×1

python ×1

winapi ×1