如何解决C ++:如何将变量值/非常数值声明为2D矩阵/数组的维? Array [var1] [var2] = {...}
我正在尝试在NodeMCU项目的一些用户定义的库(C ++)中使用几个2D矩阵/数组。我不知道声明/初始化之前的尺寸,而是需要通过代码的其他部分或有时是用户输入来计算尺寸。例如,矩阵
result[rw][2]={0}
尺寸'rw'是需要首先计算的变量。
就目前而言,我已经将尺寸全局声明为常量...
#define const rw 4
int main(){
....
Array[rw][2] ={};
...
}
或在我的main()函数中作为const int;效果很好。
int main(){
......
const int rw = 4;
int Array[rw][2] =.....;
......
}
但是我知道这不是解决方案。我已经阅读了一些建议使用指针或向量声明可变大小数组的文章。
考虑到我的NODEMCU内存有限并且可能需要声明这些数组中的大约50个(正负),我想知道最好的方法是什么。
这是我在Codeblocks上运行的一段代码,作为证明的概念。
#include<iostream>
#include<cstdlib>
#define _USE_MATH_DEFINES
#include<cmath>
using namespace std;
// Some function prototypes
int factorial(int num); // calculates n factorial
int n_choose_k(int n,int k); // calculates nCk
int main(){
double x[2][4]={{0.8645,0.6273,0.4741,0.6507},{0.2447,0.3987,0.1651,5.0785e-04}};
const int N = 4;
//int const num_constraints = n_choose_k(N,2);
const int num_constraints =6;
// I knew the value beforehand. But actually want to use the return value from n_choose_k(N,2)
double A[num_constraints][2*N]={0};
//// Some calculations........//////
int count = 0;
for (int i=0;i<(N-1);i++){
for(int j=i+1; j<N; j++){
double sqSum=0;
for(int rw=0; rw<2; rw++){
double colDiff = x[rw][i]-x[rw][j];
sqSum = sqSum + pow(colDiff,2);
if(rw==0){
A[count][2*i] = -2*colDiff;
A[count][2*j] = 2*colDiff;
}
if(rw==1){
A[count][2*i+1] = -2*colDiff;
A[count][2*j+1] = 2*colDiff;
}
}
double matNorm =sqrt(sqSum); //2-norm
count = count + 1;
}
}
/////////////////////////////////////
//Print matrix A
cout<< "\nA:\n";
for(int i=0;i<num_constraints;i++){
for(int j=0;j<8;j++){
cout<<A[i][j]<<"\t ";
}
cout<<"\n";
}
return 0;
}
//func def.
int factorial(int num){
int fact=1;
for(int i=1;i<=num;i++)
fact = fact*i;
return fact;
}
//func def.
int n_choose_k(int n,int k){
int const nCk = factorial(n)/(factorial((n-k))*(factorial(k)));
return nCk;
}
此代码可以很好地用作维度A矩阵/数组-N和num_constrainsts都声明为'const int'。但是,如果我想将n_choose_k(int n,int k)的返回值分配给num_constrainsts,那是行不通的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。