Answers:
a
是零值,nnz(a)
与相比,您多了2个字符numel(a)
。a(a==0)
给a(find(a==0))
。~t
比短t==0
,甚至~~t
比短t!=0
。0*(1:n)
短于 zeros(1,n)
||
和&&
和许多其他运算符不同,and 在第一个参数为标量时对结果进行标量。对于矩阵,只有元素不为零的非空矩阵的逻辑值为true。因此,我们可以0||m
代替all(all(m))
任何矩阵。
尝试0||[1 1;1 0]
并0||[1 1;1 1]
说服自己。
当您多次使用内置函数时,请执行函数句柄以保留字符,例如。 f=@find
。对于短函数名称,至少有3次出现证明了这一点,对于长函数名称,即使有两次出现也是如此。
当一个函数是单个语句时,请优先使用f=@(n)dosomething(n)
符号function r=f(n)r=dosomething(n);end
。
不幸的是,必须在全局范围和使用它们的每个函数中都声明全局变量。但是有一个例外:匿名@(n)...
函数从调用它们的作用域中“查看”所有变量。
可以f(a=0,b=0)
代替来做a=0;b=0;f(a,b)
。
这似乎是未记录的功能,但是求值顺序是从左到右(在3.8.1节中进行了检查),您可以zeros(a=n,b=a*a)
创建anxn ^ 2矩阵并将其行号和列号存储在a
和b
变量中。
运算符优先级表是您的朋友。不要做,b=(a==0)
因为b=a==0
是一样的。
我不记得有人看到过什么挑战(请告诉我们=),但是我发现这很巧妙:
通常,如果添加矩阵,则必须具有相同的大小,但是对于一维(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'
。除此之外,这些提示还不错=)
+= -= /=
下面的列表中添加etc运算符吗?
+a
短于a+0
-在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}
使用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])`;
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