在我正在研究的程序中,我需要重复乘以两个矩阵.由于其中一个矩阵的大小,这个操作需要一些时间,我想看看哪种方法最有效.矩阵的尺寸(m x n)*(n x p)在哪里m = n = 3和10^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) 我在尝试将 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 参数标识的对象。
我不明白这到底是什么意思,但我想这是我问题的根源。我发现它做什么,我希望有一个函数的例子 …