C++:将矩阵存储在一维数组中
C++: storing a matrix in a 1D array
我对C++很陌生,但我的任务是将一段C++代码翻译成python。
浏览文件,我发现了这段代码,这让我感到困惑:
int n_a=(e.g 10)
int n_b=n_a-1;
int l_b[2*n_b];
int l_c[3*n_b];
int l_d[4*n_b];
for (int i=0; i<n_b; i++){
for (int j=0; j<2; j++) l_b[i*2+j]=0;
for (int j=0; j<3; j++) l_c[i*3+j]=0;
for (int j=0; j<4; j++) l_d[i*4+j]=0;
我知道它创建了 3 个数组,每个数组的长度由 n_b 变量上的操作定义,并将所有元素设置为零,但我不明白这个矩阵到底应该是什么样子,例如,如果写在纸上。
存储具有R
行和C
列的矩阵的常用方法是将所有元素存储在大小为R * C
的向量中。然后,当您需要元素(i, j)
时,只需使用i*C + j
索引向量即可。这不是将"矩阵"存储在内存中的唯一方式,但这是一种常见的方式。
在此代码中,有 3 个 C 数组用零声明和初始化。l_b
数组似乎是n_a x 2
矩阵的存储,n_a x 3
矩阵的l_c
数组和n_a x 4
矩阵的l_d
数组。
当然,这只是一种印象,因为为了确保我们稍后需要了解这些数组的使用方式。
如注释所示,如果您要将其转换为python,那么您可能应该对矩阵使用numpy。事实上,numpy 数组会将元素存储在内存中,就像我提到的索引一样(默认情况下,但您也可以选择传递额外参数的替代方式(。您可以在 oython 中对这个C++代码执行相同的操作,只需
import numpy as np
n_a = (e.g 10)
l_b = np.zeros(shape=(n_a, 2))
l_c = np.zeros(shape=(n_a, 3))
l_d = np.zeros(shape=(n_a, 4))
numpy 中的这些变量是 2D 数组,您可以像往常一样为它们编制索引。 前任:
l_d[2, 1] = 15.5
我们还可以通过使用可用的库之一来C++中使用向量、矩阵和线性代数的漂亮语法。一个这样的图书馆是犰狳。我们可以使用犰狳创建之前的三个零矩阵,作为
#include <armadillo>
int main(int argc, char *argv[]) {
unsigned int n_a = 10;
// A 10 x 3 matrix of doubles with all elements being zero
// The 'arma::fill::zeros' argument is optional and without it the matrix
// elements will not be initialized
arma::mat l_b(n_a, 2, arma::fill::zeros);
arma::mat l_c(n_a, 3, arma::fill::zeros);
arma::mat l_d(n_a, 4, arma::fill::zeros);
// We use parenthesis for index, since "[]" can only receive one element in C/C++
l_b(2, 1) = 15.5;
// A nice function for printing, but it also works with operator<<
l_b.print("The 'l_b' matrix is");
return 0;
}
如果你在gdb中检查犰狳类型,你会看到它有一个mem
的acomping,这是一个指针。这实际上是矩阵内部元素的 C 数组,当您在犰狳中索引矩阵时,它会将索引转换为此内部 1D 数组中的正确索引。
您可以在 gdb 中打印此内部参数中的元素。例如,print l_b.mem[0]
将打印第一个元素,print l_b.mem[1]
将打印第二个元素,依此类推。
- 将二维数组的所有元素插入到一维数组中
- C++语法差异:二维和一维数组(指针算术)
- 多维数组存储三种不同的数据类型?
- 将一维数组写入 CSV C++中的不同列?
- C++:将矩阵存储在一维数组中
- 如何在一维数组中的每个元素中都有多个int值
- 以C++填充一维数组
- 用于在一维数组上嵌套循环操作的正确 openmp 指令
- 如何在 <threads> c++ 中使用和一维数组进行矩阵乘法?
- C++按内存地址将多维数组更改为一维数组
- 在 c++ 中返回一维数组时出错
- 一维数组映射方式的性能差异问题
- 如何使用一维数组更改二维数组中的值?
- 使用二维数组作为一维数组是否正确?可能会导致未定义的行为左右?
- 将一维数组转换为二维数组
- 如何使用一维数组列表初始化二维数组
- 在一维数组中对二维进行排序
- 将一维数组的索引转换为二维数组
- 在不使用额外存储器的情况下,将矩阵存储在一维数组中
- 乘以存储在一维数组中的上三角矩阵