一个如何最有效地计算或有值?

时间:2018-12-27 19:30:53

标签: vba performance userform

假设我有10个值n_1,n_2,... n_10,并且给定这些值中的任何一个,则可以计算另外9个值。令f_i(n_j)是使用n_j的值(其中i!= j)计算值n_i的函数。这些函数相对简单(即,最多包含几个指数函数或幂)。

就所使用的功能而言,在给定最初已知的1的情况下,创建程序来计算n_1,...,n_10中其他9个值的最有效方法是什么?

最好的选择是减少使用的函数数量(从而减少代码行数),还是创建定义每个单个映射的函数?

例如,仅使用18个功能是否最有效

f_1(n_2), f_1(n_3), ..., f_1(n_10)        [1]
f_2(n_1), f_3(n_1), ..., f_10(n_1)        [2]

然后,对于用户提供的任何输入,可以使用行1中的相关函数来计算n_1的值,然后可以使用行[[ 2]?

还是最好定义所有90个映射,以便只调用一个函数(而不是2个函数)来计算其他9个值中的每个?

编辑:我要实现的具体结果如下...

我当前正在使用VBA,其用户格式为以下格式:

form

转换频率是必填字段(因此,例如,总是等于2并忽略它)。我想在更改事件上使用,以便每当用户更改转换频率字段下方的6个字段中的任何一个时,其他5个字段都会自动填充正确的值。但是,由于用户只需要更新六个字段中的任何一个一个,并由此计算出其他五个字段,我们将需要6 ^ 6-6 = 30个不同的函数来进行这些计算。因此,我们将获得许多重复的代码。

我的问题涉及使用可提供许多输入之一的表格时应遵循的最佳实践,并且必须根据提供的输入及其值来更新所有其他字段。

或者等效地,当一个字段的值更改时,是否有一种方法可以更新所有字段?是否可以做到这一点而无需随着行数的增加而使所需的代码行数呈指数增加?

1 个答案:

答案 0 :(得分:0)

我认为您对此太过思索了。根据您所需的公式来考虑这一点;我认为是6。6个函数每个需要5个输入:

{
  "name": "now-ui-dashboard-angular",
  "version": "1.0.0",
  "license": "MIT",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "6.0.2",
    "@angular/common": "6.0.2",
    "@angular/compiler": "6.0.2",
    "@angular/core": "6.0.2",
    "@angular/forms": "6.0.2",
    "@angular/http": "6.0.2",
    "@angular/platform-browser": "6.0.2",
    "@angular/platform-browser-dynamic": "6.0.2",
    "@angular/platform-server": "6.0.2",
    "@angular/router": "6.0.2",
    "@ng-bootstrap/ng-bootstrap": "2.0.0",
    "@ngx-translate/core": "^11.0.1",
    "@ngx-translate/http-loader": "^4.0.0",
    "ajv": "6.2.1",
    "ajv-keywords": "3.1.0",
    "angular5-data-table": "^1.0.3",
    "bootstrap": "4.1.0",
    "chart.js": "2.7.2",
    "chartist": "0.11.0",
    "classlist.js": "1.1.20150312",
    "copy-webpack-plugin": "4.3.0",
    "core-js": "2.4.1",
    "font-awesome": "4.7.0",
    "hammerjs": "2.0.8",
    "jquery": "3.2.1",
    "jw-bootstrap-switch-ng2": "1.0.10",
    "ng2-charts": "1.6.0",
    "ngx-toastr": "^8.5.0",
    "node-sass": "^4.11.0",
    "nouislider": "10.0.0",
    "perfect-scrollbar": "1.1.0",
    "popper.js": "1.14.3",
    "rellax": "1.4.0",
    "rxjs": "6.1.0",
    "rxjs-compat": "6.1.0",
    "web-animations-js": "2.3.1",
    "zone.js": "0.8.26"
  },
  "devDependencies": {
    "@angular/cli": "1.7.4",
    "@angular/compiler-cli": "6.0.2",
    "@angular/language-service": "6.0.2",
    "@types/bootstrap": "3.3.32",
    "@types/chartist": "0.9.34",
    "@types/googlemaps": "3.30.8",
    "@types/jasmine": "2.5.38",
    "@types/jquery": "1.10.31",
    "@types/node": "6.0.73",
    "codelyzer": "4.2.1",
    "jasmine-core": "3.1.0",
    "jasmine-spec-reporter": "4.2.1",
    "karma": "2.0.0",
    "karma-chrome-launcher": "2.2.0",
    "karma-cli": "1.0.1",
    "karma-coverage-istanbul-reporter": "1.4.2",
    "karma-jasmine": "1.1.1",
    "protractor": "5.3.1",
    "ts-node": "5.0.1",
    "tslint": "5.9.1",
    "typescript": "2.7.2"
  }
}

事件处理程序和计算值的代码是他们自己的东西。您的onchange事件处理程序只需要调用正确的方法即可;这是6个事件处理程序,分别调用5个方法,因此,如果要保持计数,则有11个函数。有很多copypasta。例如:

calculateEIR(nominalInterestRate, ForceOfInterest, DiscountFactor, EffectiveDiscountRate, NominalDiscountRate)
calculateNIR(EffectiveInterestRate, ForceOfInterest, DiscountFactor, EffectiveDiscountRate, NominalDiscountRate)
' and so on...

我不确定如何根据其他值的更改来更改所有值的具体细节(因为我不知道公式),但是一般而言,您不应该以任何方式使用30个函数。