如何将向量转换为矩阵C ++ vec2mat

时间:2018-12-28 00:44:57

标签: c++

我最近看到了这段代码,我认为这对vec2mat从matlab到C ++是等效的:

int mat vec2mat(vec V, size_t cols) {
size_t rows = std::ceil(V.n_elems / double(cols));
return V.reshape(cols, rows);// return the original vector as matrix

我尝试将其应用于我的代码,但是没有成功。我希望有人能帮助我找到正确的方法。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() 
{
    int cargas[20];
    srand(time(NULL));
    int i;

    for (i = 0; i < 20; i++) 
    {
        cargas[i] = (rand() % 5) + 1;
    }

    for (i = 0; i < 20; i++)
        printf("%d ", cargas[i]);
}

(我想将向量变成4x5矩阵)

2 个答案:

答案 0 :(得分:1)

您发布的例程似乎正在使用armadillo库。更正后的版本可能是:

#include <armadillo>

arma::mat vec2mat(const arma::vec& V, size_t cols)
{
  size_t rows = std::ceil(V.n_elem / double(cols));
  return arma::reshape(V, rows, cols);
}

请注意,例程需要将armadillo类型为arma::vec作为输入;它不适用于C样式的数组,但是您可以说将其转换为arma::vec

有关该库的更多信息,请参见armadillo documentation

答案 1 :(得分:0)

在指定的情况下,这非常简单-您只需要创建2D数组并从1D数组填充它。如果您知道在编译时要使用的尺寸,则可以静态完成2D数组的初始化

int array[4][5];

然后您像这样填充

for (int i = 0; i < 4; i++) {
  for (int j = 0; j < 5; j++) {
    array[i][j] = cargas[i*5 + j];
  }
}

array现在是由cargas填充的2D数组。但是,如果您在编译时不知道所有尺寸,则必须动态分配-

int** array = new int*[4];
for (int i = 0; i < 4; i ++) {
  array[i] = new int[5];
}

然后以与以前相同的方式填充。如果您要使用问题中所述的vec2mat格式的函数,则可以使用类似

的方法
int** reshape(int* in, int n, int m) {
    int** ret = new int*[n];
    for (int i = 0; i < n; i++) {
        ret[i] = new int[m];
        for (int j = 0; j < m; j++) {
            ret[i][j] = in[i*m + j];
        }
    }
    return ret;
}

完整示例

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() 
{
    int cargas[20];
    srand(time(NULL));
    int i, j;

    for (i = 0; i < 20; i++) {
        cargas[i] = (rand() % 5) + 1;
    }
    int** array2D = reshape(cargas, 4, 5);

    for (i = 0; i < 4; i++) {
      for (j = 0; j < 5; j++) {
        printf("%d ", array2D[i][j]);
      }
    }
    for (i = 0; i < 20; i++) {
        printf("%d ", cargas[i]);
    }
}

注意

动态多维数组对于内存性能而言是可怕的,最好是使用带有索引的一维数组使它像多维数组一样工作,因为它在迭代时提供更多顺序的,较少随机或半随机的读写(例如,对于2D使用array[i*nrows + j]代替array[i][j],对于3D使用array[i + nrows*j + nrows*ncols*k]代替array[i][j][k]。此外,如果您使用的是C ++(您的代码似乎比C ++更多的C),最好使用STL中的std::arraystd::vector


此外:在C ++中,在数学意义上使用“向量”会引起一些混淆,因为vector通常是指STL容器std::vector