1

假设我们有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 formA(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)

4

1 回答 1

1

I我认为如果你的意思是你应该小心使用identity matrixIdentity matrix通常是方阵,而您使用的通常不是方阵,因为您从原始矩阵中删除了列。让我将转换矩阵称为T,而不是I

现在我试图回答你的问题:

问题是如何快速形成这些矩阵

所以基于上述假设,T(2)应该是:

1  0
0  0
0  1

自从

1   2  3       1  0     1  3
4   5  6   *   0  0  =  4  6
7   8  9       0  1     7  9

您可以根据删除第二列的情况将T(2)与原始I(3)(这里是单位矩阵)进行比较。

      1  0  0
I(3)  0  1  0
      0  0  1

由于您知道要删除哪一列,因此您将知道用于存储的一维数组的索引范围I(3),在这种情况下,它是A_I(3) = [1 0 0 0 1 0 0 0 1]:您知道索引[3,5]是第二列,您只需删除这 3 个值,您将得到T(2)如上例所示的A_T(2) = [ 1 0 0 0 0 1]. 所以想法是,如果您知道要删除原始矩阵的哪一列,您只需从存储原始列映射到的索引范围内的单位矩阵的一维数组中删除值。[3,5]在此示例中,您从原始矩阵映射到的2nd列中删除值。

现在,您可以使用 Matrix 库进行乘法运算AA_T(2)获得结果矩阵。

于 2013-04-23T17:50:04.077 回答