相关疑难解决方法(0)

哪些语言支持*递归*函数文字/匿名函数?

现在似乎有不少主流语言支持函数文字.它们也被称为匿名函数,但我不在乎它们是否有名称.重要的是函数文字是一个表达式,它产生一个尚未在别处定义的函数,因此例如在C中,&printf不计算.

编辑添加:如果你有一个真正的函数文字表达式<exp>,你应该能够将它传递给一个函数f(<exp>)或立即将它应用于一个参数,即.<exp>(5).

我很好奇哪些语言可以让你编写递归的函数文字.维基百科的" 匿名递归 "文章没有给出任何编程示例.

我们以递归因子函数为例.

以下是我所知道的:

  • JavaScript/ECMAScript可以用callee:

    function(n){if (n<2) {return 1;} else {return n * arguments.callee(n-1);}}
    
    Run Code Online (Sandbox Code Playgroud)
  • 在语言方面很容易letrec,例如Haskell(称之为let):

    let fac x = if x<2 then 1 else fac (x-1) * x in fac

    Lisp和Scheme中有等价物.请注意,绑定fac是表达式的局部,因此整个表达式实际上是一个匿名函数.

还有其他人吗?

recursion language-features function-literal anonymous-function letrec

16
推荐指数
4
解决办法
3141
查看次数

在MATLAB中找到矩阵的最大公约数

我正在寻找一种方法来划分具有最低公约数的某些矩阵元素.

例如,我有矢量

[0,0,0; 2,4,2;-2,0,8]
Run Code Online (Sandbox Code Playgroud)

我可以告诉最低公约数是2,所以除法后的矩阵将是

[0,0,0;1,2,1;-1,0,4]
Run Code Online (Sandbox Code Playgroud)

什么是内置方法可以计算这个?

提前致谢

ps我个人不喜欢使用循环进行此计算,似乎内置计算可以执行矩阵元素划分.

matlab matrix vectorization

7
推荐指数
2
解决办法
1346
查看次数

如何使用可变数量的输出参数编写匿名函数?

使用deal我们可以编写具有多个输出参数的匿名函数,例如

minmax = @(x)deal(min(x),max(x));
[u,v] = minmax([1,2,3,4]); % outputs u = 1, v = 4
Run Code Online (Sandbox Code Playgroud)

但是如果你想为优化函数提供一个具有渐变的函数,那么fminunc这不起作用.该函数fminunc有时会调用输入函数,有时会调用两个输出参数. (编辑:这不是真的,你只需要指定你是否真的想要使用渐变,使用例如optimset('SpecifyObjectiveGradient',true).然后在一次调用中它总是要求相同数量的参数.)

我们必须提供类似的东西

function [f,g] = myFun(x)
 f = x^2; % function
 g = 2*x; % gradient
Run Code Online (Sandbox Code Playgroud)

可以使用一个两个输出参数调用.

那么有没有办法在不使用function关键字的情况下进行同样的内联?

matlab anonymous-function variadic-functions function-handle output

6
推荐指数
2
解决办法
185
查看次数

寻找径向线段的最近邻

首先,不要被这个问题的外表吓到;)

我正在尝试在 matlab 中实现一个称为圆形模糊形状模型的形状描述符,其中一部分是获取每个径向线段的最近邻居列表,如图 1d 所示)

我在 MATLAB 中进行了直接而简单的实现,但我停留在算法的第 5 步和第 6 步,主要是因为我无法理解定义:

Xb{c,s} = {b1, ..., b{c*s}} as the sorted set of the elements in B* 
so that d(b*{c,s}, bi*) <= d(b*{c,s}, bj*), i<j
Run Code Online (Sandbox Code Playgroud)

对我来说,这听起来像是级联排序,首先按升序排序,然后按升序排序,但我找到的最近邻居不是根据论文。

圆形模糊形状模型描述算法

作为示例,我向您展示了我为段 b{4,1} 获得的最近邻居,这是图 1d 中标记为“EX”的那个)

我得到以下 b{4,1} 的最近邻居列表: b{3,2}, b{3,1}, b{3,8}, b{2,1}, b{2,8}

根据论文正确的是: b{4,2}, b{4,8}, b{3,2}, b{3,1}, b{3,8}

然而,我的点实际上是最接近由欧几里德距离测量的选定线段的集合!距离b{4,1} <=> b{2,1}小于b{4,1} <=> b{4,2}b{4,1} <=> b{4,8}...

在此处输入图片说明

这是我的(丑陋但直接的)MATLAB 代码:

width  = 734;
height = 734;

assert(width == height, 'Image …
Run Code Online (Sandbox Code Playgroud)

algorithm matlab geometry nearest-neighbor feature-descriptor

5
推荐指数
1
解决办法
911
查看次数

三元运算在八度中有效吗?

问题是三元运算有效,因为我无法在网上找到任何与之相关的文档。而且我还发现三元在MATLAB 中是不可能的,因此任何建议和答案都将在此处受到赞赏。

#带三元运算的代码

taxes = (income > 50000)*(((income-50000) * 0.20)+(0.10*50000)) + (~(income > 50000))*0.10 *50000
#Condition True and this computation False then this computation
Run Code Online (Sandbox Code Playgroud)

#代码与if和else

if (income) > 50000
#income = income - 50000
#Taxed at 10% (i.e 0.10) for $ 50000
#taxes = 50000 * 0.10
#Rest income will be Taxed at 20% (i.e 0.20)
taxes = 50000 * 0.10 + ((income-50000) * 0.20)
else
#Taxed at 10% (i.e 0.10)
taxes = income * 0.10
endif …
Run Code Online (Sandbox Code Playgroud)

matlab octave conditional-operator

5
推荐指数
1
解决办法
181
查看次数

脚本中的递归内联匿名函数

我尝试在Matlab脚本中编写递归内联匿名函数.

这是一个MWE:

funR = @(x) [x(1) funR(x(2:end))];
funR(0:5);
Run Code Online (Sandbox Code Playgroud)

但是这引发了以下异常:

未定义的函数或变量'funR'.

这在函数文件中运行时有效,但在脚本中运行时则无效.这是因为Matlab确实以不同方式阅读了这些内容

我对这个MWE的预期结果是:

[0, 1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

怎么做对了?

目标是将funR定义为内联函数,因此两个或更多行解决方案不是我想要的.如果这个或MWE有任何意义,请忽略,这不是这个问题的重点.

recursion matlab inline anonymous-function

4
推荐指数
1
解决办法
250
查看次数

是否可以在MATLAB中使用递归匿名函数?

我一再想要应用一个函数,使用过去的输出作为新输入.为了便于阅读(我从数学的角度来看,而不是程序员的观点),我想将它定义为一个简单的匿名函数而不是一个完整的函数块.所以,而不是像

function f=myfun(x,n)
    if n>1
        f=myfun(myfun(x,n-1),1);
    else
        f=expression(x);
    end
end
Run Code Online (Sandbox Code Playgroud)

我想能写

f=@(x,n) ????
Run Code Online (Sandbox Code Playgroud)

这有可能吗?

matlab functional-programming anonymous-function

3
推荐指数
1
解决办法
821
查看次数