【发布时间】: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