如何在Octave中使用匿名函数交换向量中的元素?


15

在Octave中交换向量/矩阵中的两个元素非常简单:

x='abcde';
x([4,1])=x([1,4])
x = 
   dbcae

不幸的是,我还没有找到在匿名函数中执行此操作的方法。尽管下面的函数在语法上是正确的,但它只返回交换的两个元素,而不是整个x向量:

f=@(x)(x([4,1])=x([1,4]))
f(x)
ans = 
     ad

是否有一种方法可以通过匿名方法使用匿名函数来实现所需的行为?可以使用匿名函数以这种方式交换几个元素吗?

可以创建一个索引向量:f=@(x)x([4,2,3,1,5]),但是动态创建这样的向量也可能会占用很多字节。


Answers:


21

参数列表

f=@(x,y=x([4 1])=x([1 4]))x;

在线尝试!


5
等等什么?我从来不知道在八度有这种可能。这打开了许多新技术……
。– Sanchises

4
在...什么?
Stewie Griffin

1
请在“八度提示”问题中发布此信息!使用此技术,您基本上可以执行参数列表中的所有操作,因此您无需再次在“完整”函数和匿名函数之间进行选择。我感到震惊。
Sanchises

3
惊人。顺便说一句,您可以;出于字节数的目的而删除最终版本
Luis Mendo

感谢所有@@ Sanchises似乎Octave是一种令人震惊的语言。小心!它被添加到提示。
rahnema18年

11

eval

f=@(x)eval"x([4 1])=x([1 4])"

在线尝试!


在Matlab中,括号不能省略:

f=@(x)eval('x([4 1])=x([1 4])')

9
eval答案仅在PPCG上:-)
Stewie Griffin

你想添加这个到八度的技巧问题?for使用eval保存的大量字节在匿名函数内部循环,并且可能也可以应对其他许多挑战,
Stewie Griffin

不知道它是否曾经是高尔夫球手,但我想即使没有匿名函数也可以做到这一点:s='x([1 4])=x([4 1])';eval(s)-我想如果您已经制作了一个函数可以用最少的字符进行eval 运算,那将很有趣。
丹尼斯·贾赫鲁丁


2
我认为这个答案是迄今为止唯一有效的Octave和Matlab答案。
蝙蝠侠

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.