我最近看到了这段代码,我认为这对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矩阵)
答案 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::array
或std::vector
。
此外:在C ++中,在数学意义上使用“向量”会引起一些混淆,因为vector
通常是指STL容器std::vector
。