【问题标题】:Removing the column(s) from matrices in a fast way C++快速从矩阵中删除列 C++
【发布时间】:2013-04-24 01:50:04
【问题描述】:

假设我们有矩阵A (m*n) 以压缩形式存储(大小为m*n 的一维数组 - 具有前导维度 - 列)。我需要减少矩阵A(S) - 这是由于从A 中删除1 个或更多列而导致的。我可以在循环中轻松地手动完成此操作,但还有另一种方法 - 使用选择矩阵I(S),它是删除了 1 列或更多列的单位矩阵(对角线上全为零,但对角线为 1)。然后,例如如果我需要从A 中删除第三行,我需要形成I(3) - 没有第三列的标识,然后是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)

【问题讨论】:

  • 您是否真的需要特定矩阵数据类型的结果(或者需要修改矩阵)?因为否则在我看来,最有效的方法可能是编写matrix_view 类,它的作用类似于普通矩阵,但会修改访问时的索引以省略列,因为这实际上可以让你从执行复制。

标签: c++ arrays matrix intel multiplication


【解决方案1】:

如果你的意思是identity matrix,我认为你应该小心使用IIdentity 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 列映射到的值。

现在您可以使用矩阵库将AA_T(2) 相乘并得到结果矩阵。

【讨论】:

  • 是的,你写的都很清楚,我没有理解问题背后的数学问题。问题是如何使用 c++ 从a=[1,0,0,0,0,1] 中快速获取数组b=[1,4,7,3,6,9]。 2个主要问题是:时间和空间复杂度。我的目标矩阵可能包含数十亿个元素
  • @user2028058 如果您只需要在删除第二列时获取 b ,我认为您可以直接在数组上执行此操作,因为您知道要删除的第二列,那么您需要删除具有索引值的条目[3,5],在这种情况下是 2,5,8。我猜你甚至不再需要了。
  • 这显然是蛮力的方式.. 运行循环 mn 次并将所需的元素复制到 b。想象一下对 A.. 中删除的列的每个排列执行这个 mn 操作。
  • @user2028058 我认为无论如何您都必须将元素从 a 复制到 b,对吗?但是如果您根据要删除的索引值知道哪些元素不属于 b,那么您只需遍历 a 并写入 b,尽管数组 a 的长度始终为 m*n。我假设您总是知道要删除哪一列并且总是存储在一维数组中。我能想到的就这么多了,反正我不是矩阵运算专家,抱歉,没用。
猜你喜欢
  • 2011-05-09
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
相关资源
最近更新 更多