A compact “if” statement using “or” operator
現在この質問をフォロー中です
- フォローしているコンテンツ フィードに更新が表示されます。
- コミュニケーション基本設定に応じて電子メールを受け取ることができます。
エラーが発生しました
ページに変更が加えられたため、アクションを完了できません。ページを再度読み込み、更新された状態を確認してください。
古いコメントを表示
A more compact way to write the “if” statement using “or” operator, than this one?
if i == 1 || i == 2 || i == 7 || i == 8 || i == 10
% ...
end
Something similar to this statement?
if i == [1 2 7 8 10]
% ...
end
採用された回答
Dyuman Joshi
2023 年 6 月 1 日
編集済み: Dyuman Joshi
2023 年 6 月 1 日
Yes there is - ismember
vec = [1 2 7 8 10];
i = 4;
%Checks if elements in i are present in vec or not
ismember(i,vec)
ans = logical
0
if ismember(i,vec)
disp('if')
else
disp('else')
end
else
7 件のコメント
Sim
2023 年 6 月 1 日
An efficient approach with ANY():
if any(i==[1,2,7,8,10])
@Stephen23, testing the time taken by both approachs wields similar results, with ismember() having slightly better run time
timetesting(1e5)
Time taken by any for n = 100000 elements is 7.782450e-05 secs
Time taken by ismember for n = 100000 elements is 6.332450e-05 secs
ans = logical
1
timetesting(1e7)
Time taken by any for n = 10000000 elements is 7.391765e-03 secs
Time taken by ismember for n = 10000000 elements is 7.042764e-03 secs
ans = logical
1
function timetesting(n)
vec = rand(n,1);
y = vec(randi(n));
%any
f1 = @(a,b) fun1(a,b);
%ismember
f2 = @(a,b) fun2(a,b);
F1 = @() f1(y, vec);
F2 = @() f2(y, vec);
fprintf('Time taken by any for n = %d elements is %d secs\n', n, timeit(F1))
fprintf('Time taken by ismember for n = %d elements is %d secs\n', n, timeit(F2))
isequal(F1(),F2())
function z1 = fun1(y,vec)
z1=any(y==vec);
end
function z2 = fun2(y,vec)
z2=ismember(y,vec);
end
end
James Tursa
2023 年 6 月 1 日
編集済み: James Tursa
2023 年 6 月 1 日
You can also use this FEX submission anyEq by Jan for short circuiting mex approach:
Which method is fastest is going to depend on the data. I am guessing that any( ) and ismember( ) may be short-circuiting and multi-threaded in the background, whereas anyEq( ) is only short-circuiting and not multi-threaded. For random data sets, maybe the middle element match is the best single point comparison. In any event, here are the results on my PC using a modified timetesting routine. You can draw your own conclusions.
>> timetesting(1e5)
First element test ...
Time taken by any for n = 100000 elements is 4.524267e-05 secs
Time taken by ismember for n = 100000 elements is 4.477289e-05 secs
Time taken by anyEq for n = 100000 elements is 4.171053e-06 secs
Middle element test ...
Time taken by any for n = 100000 elements is 3.773170e-05 secs
Time taken by ismember for n = 100000 elements is 3.633585e-05 secs
Time taken by anyEq for n = 100000 elements is 5.452644e-05 secs
Last element test ...
Time taken by any for n = 100000 elements is 4.850370e-05 secs
Time taken by ismember for n = 100000 elements is 5.633299e-05 secs
Time taken by anyEq for n = 100000 elements is 1.259781e-04 secs
>> timetesting(1e6)
First element test ...
Time taken by any for n = 1000000 elements is 4.766502e-04 secs
Time taken by ismember for n = 1000000 elements is 8.393297e-04 secs
Time taken by anyEq for n = 1000000 elements is 4.046598e-06 secs
Middle element test ...
Time taken by any for n = 1000000 elements is 6.579002e-04 secs
Time taken by ismember for n = 1000000 elements is 4.371002e-04 secs
Time taken by anyEq for n = 1000000 elements is 5.775002e-04 secs
Last element test ...
Time taken by any for n = 1000000 elements is 1.343650e-03 secs
Time taken by ismember for n = 1000000 elements is 9.622297e-04 secs
Time taken by anyEq for n = 1000000 elements is 1.145030e-03 secs
>> timetesting(1e7)
First element test ...
Time taken by any for n = 10000000 elements is 7.754430e-03 secs
Time taken by ismember for n = 10000000 elements is 7.475530e-03 secs
Time taken by anyEq for n = 10000000 elements is 4.097298e-06 secs
Middle element test ...
Time taken by any for n = 10000000 elements is 8.172130e-03 secs
Time taken by ismember for n = 10000000 elements is 8.390230e-03 secs
Time taken by anyEq for n = 10000000 elements is 5.566130e-03 secs
Last element test ...
Time taken by any for n = 10000000 elements is 1.057803e-02 secs
Time taken by ismember for n = 10000000 elements is 9.976730e-03 secs
Time taken by anyEq for n = 10000000 elements is 1.105403e-02 secs
>> timetesting(1e8)
First element test ...
Time taken by any for n = 100000000 elements is 7.226343e-02 secs
Time taken by ismember for n = 100000000 elements is 7.215803e-02 secs
Time taken by anyEq for n = 100000000 elements is 3.966129e-06 secs
Middle element test ...
Time taken by any for n = 100000000 elements is 8.314263e-02 secs
Time taken by ismember for n = 100000000 elements is 7.997993e-02 secs
Time taken by anyEq for n = 100000000 elements is 5.639903e-02 secs
Last element test ...
Time taken by any for n = 100000000 elements is 9.267643e-02 secs
Time taken by ismember for n = 100000000 elements is 9.262103e-02 secs
Time taken by anyEq for n = 100000000 elements is 1.115631e-01 secs
And the code:
function timetesting(n)
vec = rand(n,1);
%any
f1 = @(a,b) fun1(a,b);
%ismember
f2 = @(a,b) fun2(a,b);
%anyEq
f3 = @(a,b) fun3(a,b);
% First element test
disp('First element test ...')
y = vec(1);
F1 = @() f1(y, vec);
F2 = @() f2(y, vec);
F3 = @() f3(y, vec);
fprintf('Time taken by any for n = %d elements is %d secs\n', n, timeit(F1))
fprintf('Time taken by ismember for n = %d elements is %d secs\n', n, timeit(F2))
fprintf('Time taken by anyEq for n = %d elements is %d secs\n', n, timeit(F3))
% Middle element test
disp('Middle element test ...')
y = vec(round(n/2));
F1 = @() f1(y, vec);
F2 = @() f2(y, vec);
F3 = @() f3(y, vec);
fprintf('Time taken by any for n = %d elements is %d secs\n', n, timeit(F1))
fprintf('Time taken by ismember for n = %d elements is %d secs\n', n, timeit(F2))
fprintf('Time taken by anyEq for n = %d elements is %d secs\n', n, timeit(F3))
% First element test
disp('Last element test ...')
y = vec(end);
F1 = @() f1(y, vec);
F2 = @() f2(y, vec);
F3 = @() f3(y, vec);
fprintf('Time taken by any for n = %d elements is %d secs\n', n, timeit(F1))
fprintf('Time taken by ismember for n = %d elements is %d secs\n', n, timeit(F2))
fprintf('Time taken by anyEq for n = %d elements is %d secs\n', n, timeit(F3))
function z1 = fun1(y,vec)
z1=any(y==vec);
end
function z2 = fun2(y,vec)
z2=ismember(y,vec);
end
function z3 = fun3(y,vec)
z3=anyEq(y,vec);
end
end
Since we're comparing floats, a similar comparison can be made between ismembertol() and
z = any(abs(y-vec) <= tol)
In this case (at least with my testing), the advantage of the rudimentary comparison is much more significant (a couple orders of magnitude).
Dyuman Joshi
2023 年 6 月 1 日
編集済み: Dyuman Joshi
2023 年 6 月 1 日
It is interesting to note that anyEq() is the fastest for first element and the slowest for the last element, and there timings of any() and ismember() are similar.
Edit - In the Overview section of the FileEx submission, Jan mentions - "Best case (first element matches): 99.99% faster for 1e6 elements (Matlab 2011b/64, MSVC 2008)"
%From the above tests done by James Tursa
n_any = 4.766502e-04;
n_is = 8.393297e-04;
n_eq = 4.046598e-06;
1-n_eq/n_any
ans = 0.9915
1-n_eq/n_is
ans = 0.9952
And it still holds.
Sim
2023 年 6 月 2 日
その他の回答 (0 件)
カテゴリ
ヘルプ センター および File Exchange で Numerical Integration and Differentiation についてさらに検索
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
