假设我们有A (m*n)
以压缩形式存储的矩阵(一维大小的数组m*n
- 具有前导维度 - 列)。我需要减少矩阵A(S)
- 这是由于从A
. 我可以在循环中轻松地手动完成此操作,但是还有另一种方法 - 使用选择矩阵I(S)
,它是删除了 1 列或更多列的单位矩阵(对角线上全为零,但对角线为 1)。然后,例如,如果我需要从 中删除第 3 行A
,我需要在I(3)
没有第 3 列的情况下形成 -identity 然后A(3)=A*I(S)
。而且由于我需要 的许多变体A
,因此我需要所有不同的身份矩阵I(S)
,并删除不同的列。
我正在考虑这种方式,因为我使用英特尔数学内核库 - 这对于矩阵乘法非常有效。
所以问题是你认为形成新矩阵的最快方法是什么A(S)
:手工、直接使用A
或首先形成I(S)
——问题是如何快速形成这些矩阵——然后相乘A*I(S)
,或者你可以提出任何其他快速解决方案。
为了说明假设我们有矩阵A
:
1 2 3
4 5 6
7 8 9
它存储在数组A=[1,4,7,2,5,8,3,6,9]. Suppose I need to form
A(2)` 中,即删除第二列。我需要输出:
1 3
4 6
7 9
在 C++ 中存储为A_S=[1,4,7,3,6,9]
. 这可以直接在矩阵 A 上完成,这需要O(n^2)
时间并且对于大型矩阵效率不高。或者我们可以形成I(2)
:
1 0
0 1
0 0
在 c++ 中存储为I_S = [1,0,0,0,1,0]
. 然后A(2) = A*I(2)