问题描述
我本质上是在尝试编写一个充当 np.reshape 的函数,但使用的是 C++。我想获取一个输入矩阵,定义输出矩阵的维度,并让代码创建一个适当大小的输出数组。我在 Microsoft Visual Studio 2019 中工作,并已更改为 ISO C++ 17 标准。我知道 C++ 不是为支持可变长度数组而设计的,但我正在尝试找到一种解决方法。
int8_t reshape(int8_t **inputMatrix,int outputRows,int outputCols) {
int inputRows = sizeof(inputMatrix) / sizeof(inputMatrix[0]);
int inputCols = sizeof(inputMatrix[0]);
int ii = 0; int jj = 0;
int8_t outputMatrix[outputRows][outputCols];
for (int i = 0; i < inputRows; i++) {
for (int j = 0; j < inputCols; j++) {
outputMatrix[ii][jj] = inputMatrix[i][j];
jj++;
if (jj == outputCols) {
jj = 0;
ii++;
}
}
}
return outputMatrix;
}
我收到以下错误:
- 在行 int8_t outputMatrix[outputRows][outputCols]; 中,我收到关于变量 outputRows 和 outputCols 的双重错误“E0028 - 表达式必须有一个常量值”。
- 在同一行中,还有另一个双重错误“C2131 - 表达式未计算为常量”
- 在行 outputMatrix[ii][jj] = inputMatrix[i][j]; 中存在错误“C3863 - 数组类型 'int8_t [outputRows][outputCols]' 不可分配"
在这段代码的最终目的中,使用 malloc/calloc 是可以的,但我没能做到这一点。
解决方法
如果您可以接受第三方库,您可以尝试使用此库: VLA for C++
然后你可以像这样写你的代码:
#include "dynarray.hpp"
vla::dynarray<vla::dynarray<int8_t>> reshape(vla::dynarray<vla::dynarray<int8_t>> &inputMatrix,int outputRows,int outputCols)
{
int inputRows = inputMatrix.size();
int inputCols = inputMatrix[0].size();
int ii = 0; int jj = 0;
vla::dynarray<vla::dynarray<int8_t>> outputMatrix(outputRows,outputCols);
outputMatrix = inputMatrix; // assign value only,size will not be changed.
return outputMatrix;
}
甚至更好:
vla::dynarray<int8_t,2> reshape(vla::dynarray<int8_t,2> &inputMatrix,int outputCols)
{
int inputRows = inputMatrix.size();
int inputCols = inputMatrix[0].size();
int ii = 0; int jj = 0;
vla::dynarray<int8_t,2> outputMatrix(outputRows,size will not be changed.
return outputMatrix;
}