2016-07-06 11 views
3

私はforループのすべてのn個の反復が、私は常にこれらの線に沿って何かやる変数の値を表示する必要がある場合:ディスプレイは、変数値それぞれのn回の反復

for ii=1:1000 
    if mod(ii,100)==0 
    display(num2str(ii)) 
    end 
end 

私がある場合は思っていたがコードを高速化するためにループ外に条件を移動する方法。それとももし私ができることが違っていたら。

+2

?これにより、時間が節約される場合があります – EBH

+0

私は通常、出力が 'ii = \ n ii' – shamalaia

+2

の形式にならないようにするために' disp(ii) ' – EBH

答えて

3

あなたはネストされたループを使用することができます。

(必要な場合) thingsToDo()は、関連するカウンタを取得
N = 1000; 
n = 100; 
for ii = n:n:N 
    for k = ii-n+1:ii-1 
     thingsToDo(k); 
    end 
    disp(ii) 
    thingsToDo(ii); 
end 

。これはもう少し乱雑ですが、ifテストをたくさん節約できます。

+0

cool!私はこれに決して考えなかった。しかし、あなたのコードを試してみました( 'thingsToDo(k)'のコメント後)、0.005532秒で実行されました。私のコードは0.003336秒で実行されました。私はなぜか分からない。最初の視点で私はあなたのソリューションが速かったと思った – shamalaia

+0

私のコードは 'num2str'ranを0.004852秒で使用しています – shamalaia

+1

@shamalaia私はそれを試してみましたが、これを100回実行したところ、0.3msでかなり速くなりました= 0.006ですが、これは実際の有効な統計検定ではありません)。コードを変更する価値があるかどうかは分かりませんが、ループの繰り返し回数によって異なります。 – EBH

1

テストされた値の数が印刷された値の数よりはるかに多い場合を除き、if文を責めません。最初はこのようには見えないかもしれませんが、印刷は実際にはかなり複雑な作業です。変数を変換して出力ストリームに送る必要があります。出力ストリームは端末で印刷されます。コードを高速化する必要がある場合は、印刷データの量を減らしてください。

通常、Matlab関数はベクトル入力も受け取ります。これはdispdisplayの場合であり、単一の関数呼び出ししか行いません。さらに、文字列への変換は印刷前には不要です。 Matlabはデータを何らかのストリームに送信する必要があります(実際にはcharという引数を取るかもしれませんが、これはMatlabと同じ文字ではありません)。これはたぶん時間の無駄です。それに加えて、num2strはタイプセーフな変換を確実にするために多くのことを行います。あなたはすでにdisplayが型保証されていることを知っているので、これらのチェックはすべて冗長です。

これは代わりに試してみてください、あなたは文字列に最初にそれを変換せず、(ⅱ) ``だけ表示を使用していないのはなぜ

q = (1:1000)'; % assuming q is some real data in your case 
disp(q(mod(q,100)==0)) % this requires a single call to disp 
関連する問題