MATLAB Answers

Sonima
0

ismember 0×0 empty logical array to logic

Asked by Sonima
on 18 Apr 2019
Latest activity Commented on by Sonima
on 20 Apr 2019
Hi All,
I have an array "A = [1 2 3 4 5 6]" which its length reduces in a loop
if ~ismember(A,ID)
do this
else
do that
end
This works fine until the A=[], which ismember returns
0×0 empty logical array
However I need a Single Value and not logical array. Note that I cannot use any and all functions to reduce Logical Arrays to Single Value, beacuse I faced with other problems when "A" array is not yet empty!
How can I fix this problem?

  1 Comment

First and foremost what is your goal? What is the expected result for given A?

Sign in to comment.

Tags

2 Answers

Answer by Walter Roberson
on 19 Apr 2019
 Accepted Answer

The obvious answer would seem to be to test
if isempty(A) || ~ismember(A,ID)
If you were hoping there were a hidden preference you could set that would make ismember(A,ID) return a non-empty value without having to change your test.. sorry, there is no such test.
I would point out that you could also rewrite your code:
if ismember(A,ID)
do that
else
do this
end
the ismember() would be empty when A is empty, so the test would fail, and do that would not be done, leaving you to fall through to the do this case.

  1 Comment

I tried this already, but it doesn't work!
>> isempty(A) || ~ismember(A,ID)
Operands to the || and && operators must be convertible to logical scalar values.

Sign in to comment.


Answer by the cyclist
on 19 Apr 2019
Edited by the cyclist
on 19 Apr 2019

Making a huge guess here, but are you sure you don't mean
~ismember(ID,A)
rather than
~ismember(A,ID)
Then, assuming ID is a scalar,
~ismember(ID,[])
returns true, which I'm guessing is the result you are intending.
Like I said ... just a guess. (And you might need to adjust your other logic accordingly.)
Part of the reason I am guessing this is that
~ismember(A,ID)
returns a vector of values (if A is a vector and ID is a scalar), which is not typically what you want in an if statement. But maybe it is in your case.

  3 Comments

Hi!
No, of course it is ~ismember(A,ID)
A = [1 2 3 4 5 6 7];
ID =5;
~ismember(A,ID)
ans =
1×7 logical array
1 1 1 1 0 1 1
OK, so are you aware that
if [true true false]
do this
else
do that
end
will "do that", because every element has to be true to get to the "do this" part of the if statement. (The reason I am so insistent is that this is a very common misunderstanding, and people often think that MATLAB somehow process the vector "in parallel".)
It would be good to give a an example of a combination of A and ID where you expect your if statement to "do this". It seems to me that the only way it happens is if none of the elements of A is equal to ID, in which case there are simpler ways to do what you want.
Good point. thanks!

Sign in to comment.