【问题标题】:Store formulas as an element of an array in Matlab在 Matlab 中将公式存储为数组的元素
【发布时间】:2015-10-14 14:49:10
【问题描述】:

(*我不懂Matlab编程。这只是一个关于Matlab语言的一般问题。*)

在 Excel 中,我们可以将公式存储在单元格中。例如,如果A2 包含公式= A1+10,则当A1 的值为20 时,重新计算A2 将返回30

我的问题是,matlab中是否有类似的机制?也就是说,我们可以在 Matlab 中的数组元素中指定一个formula,以便我们以后可以重新评估该数组吗?

编辑 1: 在@rayryeng 的评论之后,我尝试举一个例子来说明这个概念......实际上,这正是 Excel 等电子表格语言可以做的。

所以我的问题是,Matlab 中是否存在允许以下内容的机制? (注意下面的语法只是象征性的)

>> B = [1 2; B{1,1}+2 4] // store some values and a formula in the array

B =

     1     2
     3     4

>> B{1,1} = 10 // change the value of one cell

B =

     10     2
     3      4

>> EVAL(B) // there is a re-evaluation command to re-calculate all the cells

ans =

     10     2
     13     4

【问题讨论】:

  • 不,任何编程语言都不是这样工作的。在 MATLAB 中,您有 functionsscripts

标签: arrays matlab functional-programming


【解决方案1】:

希望我能正确理解您想要什么,但答案确实是肯定的。您可以将“公式”存储在元胞数组中,其中每个元素都是句柄或匿名函数。

也许你的意思是这样的:

formulae = {@(x) x+10, @sin, @cos, @(x) x / 3};

语法@ 表示一个函数句柄,(x) 表示这是一个带有输入变量x 的匿名函数。第一个单元格元素提供了一个函数,它为进入其中的每个值加 10,第二个和第三个参数是 sincos 的句柄,所以它们的作用类似于三角函数。最后一个句柄将进入它的每个值除以 3。

为了演示,让我们创建一个小数组,然后遍历每个公式并将每个公式应用于小数组:

>> formulae = {@(x) x+10, @sin, @cos, @(x) x / 3};
>> A = [1 2; 3 4]

A =

     1     2
     3     4

>> formulae{1}(A)

ans =

    11    12
    13    14

>> formulae{2}(A)

ans =

    0.8415    0.9093
    0.1411   -0.7568

>> formulae{3}(A)

ans =

    0.5403   -0.4161
   -0.9900   -0.6536

>> formulae{4}(A)

ans =

    0.3333    0.6667
    1.0000    1.3333

我们首先创建公式,然后创建一个小的 2 x 2 矩阵 [1 2; 3 4]。之后,我们访问每个公式的单元格,然后将输入 A 放入函数中,我们得到你所看到的。


但是,当您开始时,请从在函数脚本中实际声明函数开始......不要将这种编程风格用于实际应用程序。它使您的代码的可读性降低。例如,sin(A)formula{2}(A) 更具可读性。阅读您的代码的人必须记住数组中的哪个位置对应于您对输入中的每个元素应用的公式。

【讨论】:

  • 感谢您的详细评论...我更新了我的 OP。您表明我们可以将公式存储在一个数组中(即formulae),这样就可以回答我的问题(答案为Yes)。但我只是意识到它与我们在 Excel 中可以做的仍然不同:似乎我们无法在公式中指定单元格。例如,每个公式都必须与常量或变量x 相关,它不能与另一个公式相关(我们不能在公式中写=B{1,1}+2)。我说的对吗?
  • @rayryeng 我认为您实际上可以做到,请在此处查看我的答案的底部:stackoverflow.com/a/33144578/1011724。但是,这可能不是 Matlab 中最惯用的做事方式,并且 OP 最喜欢将其代码重构为更简单的等效解决方案
猜你喜欢
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 2016-09-03
  • 2019-08-16
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多