0

誰かが次のコード スニペットを説明できますか? 私はコンピューター サイエンスやプログラミングのバックグラウンドがなく、つい最近 Matlab に気づきました。data=ceil(rand(7,5)*10)...からまでの事前割り当ての部分がわかりました...N*(N-1)/2)

kk=0matlab がコードを最初から最後まで処理する方法のすべての側面を理解する必要があります。また、コードがそのように体系化されている理由。の機能を説明する必要はありません:bsxfun(@minus)コードのスキームでどのように動作するかだけです。

data=ceil(rand(7,5)*10); 
N = size(data,2);
b=cell(N-1,1);
c=NaN(size(data,1),N*(N-1)/2); 

kk=0;
for ii=1:N-1
    b{ii} = bsxfun(@minus,data(:,ii),data(:,ii+1:end));
    c(:,kk+(1:N-ii)) = bsxfun(@minus,data(:,ii),data(:,ii+1:end));
    kk=kk+N-ii;
end
4

2 に答える 2

5

ゼロから開始

kk=0; 

iiが1からN-1まで、反復ごとに1ずつ増加するループ。matlab1:10のコマンドラインに入力すると、が出力されることがわかります1 2 3 4 5 6 7 8 9 10。Thuisコロン演算子は、MATLABで理解するための非常に重要な演算子です。

for ii=1:N-1 

b {ii} = ...これは、セルベクトルbの次の要素に行列を格納するだけです。セル配列は、各要素に何でも保持できます。この場合、各反復で前の反復より1列少ない行列が作成されるため、これが必要です。data(:、ii)->マトリックスデータのi番目の列を取得する(:はすべての行を取得することを意味します)data(:、ii + 1:end)は、すべての行で構成されるマトリックスデータのサブセットを取得することを意味しますが、列iiの後に表示される列のみbsxfun(@minus、data(:、ii)、data(:、ii + 1:end))->マトリックスdata(:、ii + 1:end)の各列、単一列のデータを減算します(:、ii)

b{ii} = bsxfun(@minus,data(:,ii),data(:,ii+1:end));

%これは上記の行と同じことを行いますが、ループの結果の行列をセル配列の別のセルに格納する代わりに、元の配列に新しい行列を追加します。新しいマトリックスの行数は毎回同じですが、列が1つ少ないため、これは新しい列として追加されることに注意してください。%c(:、kk +(1:N-ii))= ....->したがって、1:(N-ii)は、この反復の結果の列数までの数値1を生成します。matlabでは、別の配列を使用して配列にインデックスを付けることができます。したがって、たとえば、matlabのコマンドラインでこれを試してくださいa = [0 0 0 0 0]; a([1 3 5]) = 1。表示されるはずの結果はですa = 1 0 1 0 1。ただし、このように行列を拡張することもできるので、たとえば、と入力しa(6) = 2ます。結果:a = 1 0 1 0 1 2。したがって、c(:、1:N-ii)を使用して、cのすべての行と、適切な数の列(順番に)にインデックスを付けます。kkを追加することは、以前の結果を上書きしないように、それをオフセットするだけです。

c(:,kk+(1:N-ii)) = bsxfun(@minus,data(:,ii),data(:,ii+1:end));

ここで、追加した新しい列の数だけkkをインクリメントして、次の反復でcが最後に追加されるようにします。

kk=kk+N-ii;
end;

このコードにブレークポイントを設定し、1行ずつステップスルーして、MATLABで変数がどのように変化するかを確認することをお勧めします。これを行うには、mfileの横にある小さな破線をクリックするk=0;と、そこに赤い点が表示され、コードを実行します。コードはドットまでしか実行されないため、デバッグモードになります。デバッグモードで変数にカーソルを合わせると、matlabはその内容をツールチップに表示します。非常に大きな変数については、ワークスペースで確認してください。次に、コードを1行ずつステップ実行し、上記の説明を使用して、各行が各変数をどのように変更しているかを理解していることを確認します。b{ii} = bsxfun(@minus,data(:,ii),data(:,ii+1:end));コードスニペットを強調表示し、コマンドラインでこれらを台無しにして各部分が何をしているのかを確認する必要があるようなより複雑な行の場合、たとえば、実行data(:,ii)してそれが何をしているのかを確認してから試してくださいdata(:,ii+1:end))または単にii+1:end(その場合は機能しません。endをsize(data、2)に置き換えてください)。デバッグは、混乱を招くコードを理解するための最良の方法です。

于 2012-08-02T08:26:33.923 に答える
2
bsxfun(@minus,A,B)

とほぼ同じです

A-B

違いは、bsxfunバージョンが異なるサイズの入力を処理することです: 各次元 (そのように考える方が簡単な場合は「方向」) で、入力の 1 つがスカラーで、もう 1 つがベクトルの場合、スカラーの十分な頻度で繰り返されます。

http://www.mathworks.com/help/techdoc/ref/bsxfun.html

于 2012-08-02T07:34:01.207 に答える