2

私の研究を続けてください、

ismember実行時間が速い別の同様のロジックが必要です。私のコードのこの部分とマトリックス。

StartPost =

    14    50    30     1    72    44    76    68    63    80    25    41;
    14    50    30     1    61    72    42    46    67    77    81    27;
    35    23     8    54    19    70    48    75    66    79     2    84;
    35    23     8    54    82    72    78    68    19     2    48    66;
    69    24    36    52    63    47     5    18    11    82     1    15;
    69    24    36    52    48    18     1    12    80    63     6    84;
    73    38    50     7     1    33    24    68    29    20    62    84;
    73    38    50     7    26    61    65    32    22    18     2    69]

for h=2:2:8,
    ...
       done=all(ismember(StartPost(h,1:4),StartPost(h-1,1:4)));
    ...
end

プロファイルビューアを使用してそのコードを確認しました。この部分で、コードの実行に時間がかかるようになりました。

このロジックの経験がある人は誰でも共有してください。ありがとう

4

1 に答える 1

7

MATLAB には、文書化されていない組み込み関数がいくつかあり、他の関数と同じ結果をより速く達成するのに役立ちます。

あなたの場合、次を使用できますismembc

done = all(ismembc(StartPost(h, 1:4), sort(StartPost(h-1, 1:4)))));

ismembc(A, B)行列Bをソートし、NaNs 値を含まないようにする必要があることに注意してください。

あなたの例の実行時間の違いは次のとおりです。

tic
for h = 2:2:8
   done = all(ismember(StartPost(h, 1:4), StartPost(h-1, 1:4)));
end
toc

Elapsed time is 0.029888 seconds.


tic
for h = 2:2:8
   done = all(ismembc(StartPost(h, 1:4), sort(StartPost(h-1, 1:4))));
end
toc

Elapsed time is 0.006820 seconds.

これは約 50 倍高速です。

于 2012-08-31T17:36:26.070 に答える