gpt4 book ai didi

c++ - 以快速方式从矩阵中删除列 C++

转载 作者:太空宇宙 更新时间:2023-11-04 11:55:52 26 4
gpt4 key购买 nike

假设我们有矩阵 A (m*n) 以压缩形式存储(大小为 m*n 的一维数组 - 具有前导维度 - 列)。我需要得到缩减矩阵 A(S) - 这是从 A 中删除 1 个或多个列的结果。我可以很容易地在循环中手动完成此操作,但还有另一种方法 - 使用选择矩阵 I(S) 这是单位矩阵(所有零但对角线上的 1)删除了 1 个或多个列.然后,例如如果我需要从 A 中删除第 3 行,我需要形成 I(3) - identity without 3rd column 然后 A(3)=A *我(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] 中。假设我需要形成 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)

最佳答案

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

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

the question is how to quickly form these matrices

所以基于上述假设,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) 相乘并获得结果矩阵。

关于c++ - 以快速方式从矩阵中删除列 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16175527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com