C++:将矩阵存储在一维数组中

C++: storing a matrix in a 1D array

本文关键字:一维数组 存储 C++      更新时间:2023-10-16

我对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]将打印第二个元素,依此类推。