回答:
a
、ゼロの値はありnnz(a)
ませんnumel(a)
。スペアを使用すると、に比べて2文字多くなります。a(a==0)
にa(find(a==0))
。~t
は、よりも短くt==0
、さらに~~t
はよりも短いですt!=0
。0*(1:n)
より短い zeros(1,n)
||
および&&
、他の多くの演算子とは異なり、最初の引数がスカラーの場合、結果をスカラー化します。行列の場合、ゼロに等しい要素を持たない空でない行列のみがtrueの論理値を持ちます。したがって、任意の行列の0||m
代わりに行うことができますall(all(m))
。
を試して0||[1 1;1 0]
、0||[1 1;1 1]
自分を納得させてください。
ビルトインを何度も使用しているときは、たとえば、文字をスペアするための関数ハンドルを実行します f=@find
。短い関数名の場合、少なくとも3回の出現がこれを正当化し、長い関数名の場合は2回出現します。
関数が単一のステートメントである場合、1 つよりも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)
。
これは文書化されていない機能のようですが、評価の順序は左から右(zeros(a=n,b=a*a)
v。3.8.1で確認)であり、anxn ^ 2行列を作成して行と列の番号a
とb
変数を保存することができます。
演算子の優先順位テーブルはあなたの友人です。同じだb=(a==0)
からしないでくださいb=a==0
。
誰かがどのチャレンジで使用したのか覚えていません(教えてください=)が、これはきちんとしたトリックであることがわかりました:
通常、行列を追加する場合、同じサイズにする必要がありますが、1次元(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はデフォルトの引数を取得できるため、引数リストで式を評価できます。
この機能は、式を計算して複数回使用する場合に便利です。
f = @(x,a=sort(x))a(a>.5);
1つのユースケースは、インデックス付きの割り当てを使用して配列の一部を変更し、配列を使用する場合です。
a=[1 2 3 4]
a(2)=5;
ただし、式(a(2)=5)
はを返すa(2)
か、式(a([1 3])=4)
は2つの要素の配列を返します。どちらも配列全体を返しません。引数リストを使用できます。
f=@(a=[1 2 3 4],b=a(2)=5)a;
ここでは、インデックス付き割り当ての結果がダミー変数に格納されb
、関数は配列を返します。
-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つのアプローチは、各式をセルに配置できることです(セルには複数のタイプのオブジェクトを含めることができるため)各式のインデックスを使用して、その要素を抽出できます。
{1,4,{4 5 6},[7 ;3]}{3}
または
{a=1,b=4,c={4 5 6},[b ;3]}{4}
これはシンプルですが、便利なものです。
MATLABではなく、Octaveでは、C ++のようにできます。
x = 0 -> x = 0
x++ -> ans = 0
x -> x = 1
++x -> ans = 2
x -> x = 2
別のシンプルだが便利なもの(MATLABでは不可能):
同じ値をいくつかの変数に割り当てます。
a=b=c=0;
使用してくださいeval
!
ルイスメンドーの答えに触発されました。
匿名関数は、ほとんどの場合、1つ以上のを呼び出す必要があるスクリプトを作成するよりも短くなりますinput('')
。欠点は、ループと変数の変更(マトリックス内の2つの要素の交換など)が面倒なことではありません。
を使用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])`;
関連していますが、MATLABのヒントと同一ではありません。
Octaveのあまり知られておらず、ほとんど使用されていない機能は、ほとんどの組み込み関数を括弧なしで呼び出すことができることです。スペースが含まれる場合は、引用符が必要です。これは、を使用するときに1バイトまたは2バイトを節約するために頻繁に使用でき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