八度高尔夫打球技巧


Answers:


9
  1. 知道之后,这a是零值,nnz(a)与相比,您多了2个字符numel(a)
  2. 不想a(a==0)a(find(a==0))
  3. ~t比短t==0,甚至~~t比短t!=0
  4. 0*(1:n) 短于 zeros(1,n)
  5. 通常,||&&和许多其他运算符不同,and 在第一个参数为标量时对结果进行标量。对于矩阵,只有元素不为零的非空矩阵的逻辑值为true

因此,我们可以0||m代替all(all(m))任何矩阵。

尝试0||[1 1;1 0]0||[1 1;1 1]说服自己。

  1. 当您多次使用内置函数时,请执行函数句柄以保留字符,例如。 f=@find。对于短函数名称,至少有3次出现证明了这一点,对于长函数名称,即使有两次出现也是如此。

  2. 当一个函数是单个语句时,请优先使用f=@(n)dosomething(n)符号function r=f(n)r=dosomething(n);end

  3. 不幸的是,必须在全局范围和使用它们的每个函数中都声明全局变量。但是有一个例外:匿名@(n)...函数从调用它们的作用域中“查看”所有变量。

  4. 可以f(a=0,b=0)代替来做a=0;b=0;f(a,b)

  5. 这似乎是未记录的功能,但是求值顺序是从左到右(在3.8.1节中进行了检查),您可以zeros(a=n,b=a*a)创建anxn ^ 2矩阵并将其行号和列号存储在ab变量中。

  6. 运算符优先级表是您的朋友。不要做,b=(a==0)因为b=a==0是一样的。


7

我不记得有人看到过什么挑战(请告诉我们=),但是我发现这很巧妙:

通常,如果添加矩阵,则必须具有相同的大小,但是对于一维(1xn和nx1)矩阵,有一个快捷方式(在Matlab中不起作用):

z = (1:5)+(6:10)';

产生与

[x,y]=meshgrid(1:5,6:10);
z = x+y;

然后是pawel.boczarski提到的一些内容:在Octave中,您可以(尽管在Matlab中不能)在函数句柄中定义辅助变量,并且变量赋值本身具有赋值,因此您可以真正缩短代码(这是无用的)示例,但您会明白的):

f=@(n)(z=n+1)*z; %returns (n+1)^2

然后另一个技巧(也适用于Matlab)是滥用用于存储(硬编码)数字的字符串(此精巧技巧是从feersum偷来的),您只需要一些将字符串解释为数字的东西,就像添加零一样容易:

a = 'abc';
a+0 %returns
[97 98 99]

要么

sum('abc') == 294

我相信应该是a+0,不是a+'0'。除此之外,这些提示还不错=)
Stewie Griffin

是的,谢谢!PS:您可以在+= -= /=下面的列表中添加etc运算符吗?
瑕疵的

1
+a短于a+0
路易斯·门多

7

使用参数列表:

Octave能够获取默认参数,因此可以在参数列表中对表达式求值。

当我们要计算一个表达式并多次使用时,此功能很有用:

f = @(x,a=sort(x))a(a>.5);

一个用例是当我们使用索引分配来修改数组的一部分而我们想使用该数组时:

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

但是表达式(a(2)=5)返回a(2),或者表达式(a([1 3])=4)返回两个元素的数组。都不返回整个数组。我们可以使用参数列表:

f=@(a=[1 2 3 4],b=a(2)=5)a;

在这里,索引赋值的结果存储到一个虚拟变量中b,该函数返回数组。


6

-在Octave中,可以在临时表达式上应用索引,这是MATLAB中禁止的功能,该功能对于打高尔夫球非常有用。例:

Octave:[1 23 4 5 7](3:4) 及其等效的MATLAB:a=[1 23 4 5 7];a(3:4)
Octave:hilb(4)(4:5,4:5) 及其等效的MATLAB:h=hilb(4);h(4:5,4:5)
Octave:{1,4,{4 5 6},[7 ;3]}{3}及其等效的MATLAB:a={1,4,{4 5 6},[7 ;3]};a{3}
Octave:num2cell([1 2 3 4]){:}用于创建逗号分隔的列表
Octave:a'(:)'

-有时在匿名函数中,如正常函数一样,我们需要评估多个表达式,包括赋值,一种方法是将每个表达式放置在一个单元格中(因为单元格可以包含多种类型的对象),并且在需要该值时对于每个表达式,我们可以使用索引来提取该元素。

{1,4,{4 5 6},[7 ;3]}{3}
要么

{a=1,b=4,c={4 5 6},[b ;3]}{4}


@StewieGriffin不错的提示!答案已更新!
rahnema18年

5

跳过分号!

我将用这个答案来说明这一点。

原始代码为:

function f(x);if~movefile('f.m',x);disp("+-+\n| |\n+-+");end

删除分号后,可以将其减少为以下内容,从而节省三个字节:

function f(x)if~movefile('f.m',x)disp("+-+\n| |\n+-+")end

可以在很多地方使用它,而您甚至不尝试使用它,因为它看起来像语法错误通常可以工作。


1
您甚至不尝试使用的东西,因为它看起来像语法错误通常可以使 Octave简而言之工作
Sanchises

2

这是一个简单但有用的方法。

在Octave中,而不在MATLAB中,您可以像在C ++中那样进行操作:

x = 0  ->  x = 0
x++    ->  ans = 0
x      ->  x = 1
++x    ->  ans = 2
x      ->  x = 2

2

另一个简单但有用的方法(在MATLAB中是不可能的):

将相同的值分配给几个变量:

a=b=c=0;

2

使用eval

路易斯Mendo的回答启发这里


在大多数情况下,匿名函数比创建需要一个或多个调用的脚本短input('')。缺点是不可能进行循环和变量修改(例如交换矩阵中的两个元素)繁琐。

使用eval,您可以像使用普通匿名函数一样获取输入,并像使用普通脚本一样运行脚本:

考虑一下

c=(i=@input)('');N=i('');A=i('');for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A

与此相比:

@(c,N,A)eval('for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A')

代码是相同的,但是输入部分要短得多。


这也可以用来修改输入变量,如下所示(为此请向Luis Mendo致谢!):

f(x)eval('x([1,4])=x([4,1])`;

3
该代码是相同的,只是丑陋,较慢且可读性较差。你还能要求什么呢?:-D
路易斯·门多


1

MATLAB相关但不完全相同的技巧

Octave一个鲜为人知且很少使用的功能是,大多数内置函数都可以在不带括号的情况下调用,在这种情况下,它们会将在其后的所有内容视为字符串(只要它不包含空格)。如果包含空格,则需要引号。使用时经常可以用来保存一两个字节disp。以下所有工作,并给出相同的结果:

disp('Hello')
disp Hello
disp"Hello"

如果有空格,则必须带引号:

disp('Hello, World!')
disp"Hello, World!"

其他不太有用的示例包括:

nnz PPCG
ans = 4

size PPCG
ans = 1  4

str2num 12
ans = 12
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.