【问题标题】:anonymous function returning updated length of an array - matlab返回数组的更新长度的匿名函数 - matlab
【发布时间】:2023-04-02 00:50:02
【问题描述】:

我正在尝试编写一个返回数组长度的简单匿名函数

>> a=[1 2 3];

>> f = @() length(a);

>> f()
    3

>> a = [1 2 3 4];

>> f()
    3

是否可以编写一个函数,每次调用时返回更新后数组的长度?

【问题讨论】:

  • 您是否有理由不希望 a 作为参数传入?
  • 你只是在你的函数中调用length,那么为什么不直接使用length呢?如果需要函数句柄,请使用f = @length;
  • @jodag: "a" 可以是一个包含许多子字段的嵌套结构,因此在函数中只定义一次会很方便

标签: matlab function anonymous-function


【解决方案1】:

实现你想要的一个丑陋的方法

global a;
a = [1 2 3];
f = @() eval('global a; length(a)')
f()
a = [1 2 3 4];
f()

我不得不说我强烈建议不要使用这种类型的代码,因为它依赖于全局变量和对 eval 的调用,这两者都应该尽可能避免。

更好的方法是将a 作为参数传递给函数

a = [1 2 3];
f = @(x) length(x)
f(a)
a = [1 2 3 4];
f(a)

或者,因为在这种情况下调用 f 与调用 length 相同,所以根本没有理由使用匿名函数。

a = [1 2 3];
length(a)
a = [1 2 3 4];
length(a)

【讨论】:

  • 丑陋的eval方法真的不值一提,它只会鼓励不良行为,在可以避免的情况下不要使用eval!定义接受参数的函数是正确的答案,除了解释它之前失败的原因(因为当f 是根据a 定义时,af 中是静态的)
  • 这取决于问题的约束。如果a 不能作为参数,那么使用eval 可能是无法避免的。如果可以传入a 作为参数,则不应使用eval
  • 如果a 不能作为参数(尤其是在这么简单的情况下),那么你的代码结构很糟糕。
【解决方案2】:

根据变量定义匿名函数会使该变量在函数中成为静态变量。即

% this...
a = [1 2 3];
f = @() length(a);
% ...  is equivalent to this...
f = @() length([1 2 3]);

你想创建一个可以接受参数的匿名函数

f = @(x) length(x);
a = [1 2 3]; 
f(a); % >> ans = 3
a = [1 2 3 4]; 
f(a); % >> ans = 4

虽然此时,只需使用length(a) 并且不要定义一些指针函数!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-29
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多