C++ cblas_dgemm()中子矩阵的前导尺寸参数是如何工作的?
我有三个矩阵A、B和C: 和一般矩阵的矩阵积:C++ cblas_dgemm()中子矩阵的前导尺寸参数是如何工作的?,c++,blas,cblas,C++,Blas,Cblas,我有三个矩阵A、B和C: 和一般矩阵的矩阵积: void cblas_dgemm(常量枚举cblas_顺序、常量枚举cblas_转置、常量枚举cblas_转置、常量int_M、常量int_N、常量int_K、常量doubleα、常量double*_A、常量int lda、常量double*u B、常量int ldb、常量double、常量double*、常量ldc) 要使用cblas_dgemm-命令,我需要知道前导尺寸。对我来说,很明显,对于总矩阵A(或其转置形式),我们有:M=5,N=4,
void cblas_dgemm(常量枚举cblas_顺序、常量枚举cblas_转置、常量枚举cblas_转置、常量int_M、常量int_N、常量int_K、常量doubleα、常量double*_A、常量int lda、常量double*u B、常量int ldb、常量double、常量double*、常量ldc)代码>
要使用cblas_dgemm
-命令,我需要知道前导尺寸。对我来说,很明显,对于总矩阵A(或其转置形式),我们有:M=5,N=4,lda=4
在子矩阵C的情况下,我认为我必须给出过多的&A[5]
,并设置M=3,N=2,ldc=4
但我不知道这在红色子矩阵B中如何工作,并且M=4,N=2
。有人能给我解释一下吗。非常感谢。这篇文章非常准确:
BLAS例程明显复杂的原因是,它们具有很大的灵活性,并且经过优化,可以非常好地执行。如果例程可以应用于由感兴趣的子矩阵等组成的矩阵,那么这两个目标都可以实现。通常它们可以做的比您需要的更多xGEMM
class就是一个突出的例子。您可以执行A*B
,但也可以执行A*B+c*c
在上述情况下:
A:M=5,N=5,LDA=5
B:M=4,N=1,LDB=10
C:M=3,N=2,LDB=5
你是正确的,你在C中的第一个条目是&C[6]
换句话说,前导维度通常是外部矩阵列的长度(如果是列主维度),以及行的长度(如果是计算行主维度)
在案例B中,这有点棘手,因为当你从子矩阵的一列跳到下一列时,你必须跳过两列,每列5,即10
BLAS现在想要的是(列/行主):
从何处开始(&A[0]、&B[0]、&C[6]
/&A[0]、&B[0]、&C[5]
)
第一个维度有多长,M
(5,4,3
/4,2,2
)
这些列/行有多少,N
(4,2,2
/5,4,3
)
跳转外部矩阵到下一列/行的距离ldx
(5,10,5
)
谢谢,也谢谢你的文章!是不是A:M=5 N=4,LDA=4
和B:M=4,N=2,LDB=10
。但是你如何找到数字ldb=10
我认为前导维度就像指针从一行的第一个元素到下一行的第一个元素所要做的步骤。只有当排大调的时候。以上我所做的都是专栏专业。大多数图书馆都自然而然地主修专栏。这就是为什么我总是在C/C++中使用列主数据的原因。啊哈,现在我看到了!在这种情况下,我将使用CblasColMajor
。非常感谢,晚上好,我在博士学位上处理过这些事情。我在研究多维MRI数据。(x、y、z、时间、阶段等)代码在这里。:github.com/kvahed/codeare特别是BLAS/Lapack代码在这里: