MATLABでゴルフをするための一般的なヒントは何ですか?私は、ゴルフに関する一般的な問題のコード化に適用できる、MATLABに少なくともある程度固有のアイデアを探しています(たとえば、「コメントの削除」は答えではありません)。回答ごとに1つのヒントを投稿してください。
MATLABでゴルフをするための一般的なヒントは何ですか?私は、ゴルフに関する一般的な問題のコード化に適用できる、MATLABに少なくともある程度固有のアイデアを探しています(たとえば、「コメントの削除」は答えではありません)。回答ごとに1つのヒントを投稿してください。
回答:
ゴルフを始める前に知っておくべきこと:
MATLABの計算では、文字はASCIIコードと同じように動作します。
'abc' - 'a' % Returns: [0 1 2]
'123' - '0' % Returns: [1 2 3]
'“' == 8220 % Returns: 1 (logical)
'a':'e'==100 % Returns: [0 0 0 1 0] (logical)
プロパティ名の短縮
MATLABでは、あいまいさが生じない限り、プロパティを識別する文字列を短縮できます。
plot(X,'C','k') % Ambiguous property found.
plot(X,'Co','k') % Expands to Color (black)
これは実際に私に挑戦を勝ち取った:)
name, value
上記のペアの名前にも当てはまることを強調したい。(のようなものではないsort(rand(4,1),'descend')
)
conv(1:5,[1 1],'s')
代わりにconv(1:5,[1 1],'same')
charとしてキャストするには、charと連結します。
x='a'+magic(5) % Array with character codes of several letters
char(x) % The standard way
['' x] % The compact way
保存される文字は1つだけですが、これは非常に頻繁に使用できます。
文字列は単なる文字行ベクトルです。これは、代わりに
for i=numel(str)
a=str(i)
...
end
あなたは簡単に書くことができます
for(a=str)
...
end
初めてこれを使用した:https : //codegolf.stackexchange.com/a/58387/32352
正の整数を与えると、ユニティの -th 根n
を生成する標準的な方法はn
exp(2j*pi*(0:n-1)/n)
これにより、根1
は正の角度方向から始まり、正の角度方向に移動します。順序が重要でない場合、これは次のように短縮できます。
exp(2j*pi*(1:n)/n)
以来exp(2j*pi/4)
(虚数単位に等しいj
)、これは、よりコンパクト(トリックを次のように書くことができる@flawrによる):
j.^(4*(0:n-1)/n)
または
j.^(4*(1:n)/n)
しかし、離散フーリエ変換はさらに短い方法を提供します(2つの不要な括弧を削除してくれた@flawrに感謝します)。
fft(1:n==n)
根1
は正の角度方向から始まり、正の角度方向に移動します。または
fft(1:n==2)
で始まり1
、負の角度方向に動きます。
ここで上記のすべてを試してください。
fft(1:n==2)
関連するが、Octaveのヒントと同一ではありません。
MATLABとOctaveの両方であまり知られておらず、ほとんど使用されていない機能は、ほとんどの組み込み関数をかっこなしで呼び出すことができることです。スペースが含まれる場合は、引用符が必要です。これは、使用時にバイトを保存するために頻繁に使用できますdisp
。
disp('Hello, World!')
disp 'Hello, World!'
その他のあまり有用ではない例は次のとおりです。
nnz PPCG
ans = 4
size PPCG
ans = 1 4
str2num 12
ans = 12
私は実際にこれを「どれだけカウントできますか?」で 2回使用しました。-チャレンジ:
strchr sssssssssssssst t
はに相当しstrchr('sssssssssssssst','t')
、を返します15
。
nnz nnnnnnnnnnnnnn
はに相当しnnz('nnnnnnnnnnnnnn')
、を返します14
。
gt r s
作品のようなものも('r'>'s'
またはに相当しgt('r','s')
ます。
これはニッチなトピックかもしれませんが、ここではさまざまなことに畳み込みを使用したい人がいるようです。[引用が必要]
2Dでは、多くの場合、次のカーネルが必要です。
0 1 0
1 1 1
0 1 0
これは次を使用して実現できます
v=[1,2,1];v'*v>1 %logical
v=[1,0,1];1-v'*v %as numbers
より短い
[0,1,0;1,1,1;0,1,0]
よく使用される別のカーネルは
0 1 0
1 0 1
0 1 0
を使用して短縮できます
v=[1,-1,1];v'*v<0 % logical
[0,1,0;1,0,1;0,1,0] % naive verison
toeplitz([0 1 0])
私は頻繁にmeshgrid
or ndgrid
を使用していることに気付きます。マンデルブロ画像を計算したいので、初期化する
[x,y]=meshgrid(-2:1e-2:1,-1:1e_2,1)
今マンデルブロ集合のために、私たちは別のマトリックス必要c
の大きさのをx
してy
ますがゼロで初期化。これは、次のように書くことで簡単に実行できます。
c=x*0;
別の値に初期化することもできます:
c=x*0+3;
ただし、実際に別のディメンションを追加するだけで、いくつかのバイトを節約できますmeshgrid/ndgrid
。
[x,y,c]=meshgrid(-2:1e-2:1,-1:1e_2,1, 0); %or for the value 3
[x,y,c]=meshgrid(-2:1e-2:1,-1:1e_2,1, 3);
そして、あなたはこれをあなたが望むのと同じくらい頻繁に行うことができます:
[x,y,c1,c2,c3,c4,c5]=meshgrid(-2:1e-2:1,-1:1e_2,1, 1,pi,exp(3),1e5,-3i)
ビルトインones
とzeros
は、通常、スペースの無駄です。配列/行列(目的のサイズ)に0を掛けて(の出力を取得する)単純に乗算し、zeros
の出力が必要な場合は1を追加することで同じ結果を得ることができますones
。
d = rand(5,2);
%// Using zeros
z = zeros(size(d));
%// Not using zeros
z = d*0;
%// Using ones
o = ones(size(d));
%// Not using ones
o = 1+d*0
これは、行列の1次元のサイズのゼロまたは1の列または行ベクトルを作成する場合にも機能します。
p = rand(5,2);
z = zeros(size(p,1), 1);
z = 0*p(:,1);
o = ones(size(p, 1), 1);
o = 1+0*p(:,1);
特定のサイズの行列を作成したい場合は使用できますzeros
が、最後の要素を0に割り当てて、残りをMATLABで埋めることもできます。
%// This
z = zeros(2,3);
%// vs. This
z(2,3) = 0;
~(1:n)
1次元のゼロベクトルに使用するのが好きです。
nが連続する整数のベクトルである関数f(x_n)を合計するには、symsumではなくfevalが推奨されます。
Syms x;symsum(f(x),x,1,n);
Sum(feval(@(x)f(x),1:n));
ペアワイズ二項演算の代わりに基本演算.*
と./
が必要であり*
、/
もし関数が素朴に書けるなら、最後のどちらの方法の人も適切ではありません。
たとえば、関数がlog
次のように単純に実行できる場合sum(log(1:n))
:
Sum(f(1:n));
log(n)/x^n
あなたができるように比較的洗練された機能のために:
Sum(log(1:n)./5.^(1:n))
場合によっては、関数がf(x)=e^x+sin(x)*log(x)/x
...
Sum(feval(@(y)e.^(y)+sin(y).*log(y)./y,1:n))
それよりも著しく短い sum(feval(@(y)e.^(1:n)+sin(1:n).*log(1:n)./(1:n),1:n))
注:このトリックは、prod
または他の包括的演算子に適用できますmean