将存储在一维数组中的上三角矩阵相乘 我在C++中做上三角矩阵乘法运算。这些矩阵存储在一维数组中,而不是普通的二维数组中。值按行存储在数组中,并且忽略底部的0。我做了很多数学运算,试图找出一个模式,但我仍然想不出一个算法。假设我有两个矩阵,每个矩阵都是正方形,这两个值都存储在一维数组A和B中。我想将结果存储在数组C中。我认为最困难的部分是在for循环运行时添加不同数量的变化元素
谁能给我一些启示 我的方法是从索引形式的矩阵乘法定义开始将存储在一维数组中的上三角矩阵相乘 我在C++中做上三角矩阵乘法运算。这些矩阵存储在一维数组中,而不是普通的二维数组中。值按行存储在数组中,并且忽略底部的0。我做了很多数学运算,试图找出一个模式,但我仍然想不出一个算法。假设我有两个矩阵,每个矩阵都是正方形,这两个值都存储在一维数组A和B中。我想将结果存储在数组C中。我认为最困难的部分是在for循环运行时添加不同数量的变化元素,c++,arrays,matrix,matrix-multiplication,C++,Arrays,Matrix,Matrix Multiplication,谁能给我一些启示 我的方法是从索引形式的矩阵乘法定义开始 (A B){i,j} = sum_k A{i,k} B{k, j} 现在,您需要一种方法从i,j将索引映射到一维数组中 int toArrayIndex(tuple<int,int> ij); // return -1 if not in array tuple<int,int> toMatrixIndex(int arrayIndex); int-toArrayIndex(元组ij);//如果不在数组中,则返
(A B){i,j} = sum_k A{i,k} B{k, j}
现在,您需要一种方法从i,j将索引映射到一维数组中
int toArrayIndex(tuple<int,int> ij); // return -1 if not in array
tuple<int,int> toMatrixIndex(int arrayIndex);
int-toArrayIndex(元组ij);//如果不在数组中,则返回-1
元组toMatrixIndex(int-arrayIndex);
那么你的函数看起来就像
for(int arrayIndex=0; i<maxArrayIndex; ++arrayIndex ) {
tuple<int,int> ij = toArrayIndex(arrayIndex);
for(int k=0; k<matrixSize; ++k) {
tuple<int,int> ik = make_tuple( std::get<0>(ij), k );
tuple<int,int> kj = make_tuple( k, std::get<1>(ij) );
int ik_index = toMatrixIndex(ik);
int kj_index = toMatrixIndex(kj);
if(ik_index < 0 || kj_index < 0) continue;
ab[arrayIndex] += a[ik_index] * b[kj_index];
}
}
for(int-arrayIndex=0;i我的方法是从索引形式的矩阵乘法定义开始
(A B){i,j} = sum_k A{i,k} B{k, j}
现在,您需要一种方法从i,j将索引映射到一维数组中
int toArrayIndex(tuple<int,int> ij); // return -1 if not in array
tuple<int,int> toMatrixIndex(int arrayIndex);
int-toArrayIndex(元组ij);//如果不在数组中,则返回-1
元组toMatrixIndex(int-arrayIndex);
那么你的函数看起来就像
for(int arrayIndex=0; i<maxArrayIndex; ++arrayIndex ) {
tuple<int,int> ij = toArrayIndex(arrayIndex);
for(int k=0; k<matrixSize; ++k) {
tuple<int,int> ik = make_tuple( std::get<0>(ij), k );
tuple<int,int> kj = make_tuple( k, std::get<1>(ij) );
int ik_index = toMatrixIndex(ik);
int kj_index = toMatrixIndex(kj);
if(ik_index < 0 || kj_index < 0) continue;
ab[arrayIndex] += a[ik_index] * b[kj_index];
}
}
for(int-arrayIndex=0;i假设完整矩阵的大小为nxn
在第一行,row=0
,有N
元素。
在第二行,row=1
,有N-1
元素
在第k行中,row=k
,有N-k
元素
这是一个ASCII图:
|<- N ->|
+--+--+--+ --- +--+--+--+
| | | | | | | | row = 0, N elements
+--+--+--+ --- +--+--+--+
| | | | | | | row = 1, N-1 elements
+--+--+ --- +--+--+--+
| | | | | | row = 2, N-2 elements
+--+ --- +--+--+--+
--- +--+--+--+
| | | | row = k, N-k elements
--- +--+--+--+
+--+--+--+
| | | | row = N-3, 3 elements
+--+--+--+
| | | row = N-2, 2 elements
+--+--+
| | row = N-1, 1 element
+--+
要访问矩阵的元素,我们需要将行索引和列索引映射到1D数组中的索引
要获取第一行的第列(行索引=0
,列索引=j
),请执行以下操作:
要获取第二行的第列(行索引=1
,列索引=j
),请执行以下操作:
要获取第三行的第列(行索引=2
,列索引=j
),请执行以下操作:
要获取i
-th行的j
-th列(行索引=i
,列索引=j
)
根据上述信息,您可以编写以下函数:
为上三角矩阵分配适当的内存量
设置给定行索引(i
)和列索引(j
)的矩阵值
获取给定行索引(i
)和列索引(j
)的矩阵值
这应该足以将一个上三角矩阵与另一个上三角矩阵以及一个正则矩阵相乘。假设完整矩阵的大小为nxn
在第一行,row=0
,有N
元素。
在第二行,row=1
,有N-1
元素
在第k行中,row=k
,有N-k
元素
这是一个ASCII图:
|<- N ->|
+--+--+--+ --- +--+--+--+
| | | | | | | | row = 0, N elements
+--+--+--+ --- +--+--+--+
| | | | | | | row = 1, N-1 elements
+--+--+ --- +--+--+--+
| | | | | | row = 2, N-2 elements
+--+ --- +--+--+--+
--- +--+--+--+
| | | | row = k, N-k elements
--- +--+--+--+
+--+--+--+
| | | | row = N-3, 3 elements
+--+--+--+
| | | row = N-2, 2 elements
+--+--+
| | row = N-1, 1 element
+--+
要访问矩阵的元素,我们需要将行索引和列索引映射到1D数组中的索引
要获取第一行的第列(行索引=0
,列索引=j
),请执行以下操作:
要获取第二行的第列(行索引=1
,列索引=j
),请执行以下操作:
要获取第三行的第列(行索引=2
,列索引=j
),请执行以下操作:
要获取i
-th行的j
-th列(行索引=i
,列索引=j
)
根据上述信息,您可以编写以下函数:
为上三角矩阵分配适当的内存量
设置给定行索引(i
)和列索引(j
)的矩阵值
获取给定行索引(i
)和列索引(j
)的矩阵值
这应该足以使一个上三角矩阵与另一个上三角矩阵以及一个正则矩阵相乘
index = N + (N-1) + ... + (N-(i-1)) + (j-i)
= N + N + .. + N
- ( 1 + + (i-1) ) + j-i
= N * i - (i-1)*i/2 + (j-i)