to use ismember with arraycell

20 次查看(过去 30 天)
gg =
4×1 cell array
{'A' }
{'A'}
{'B' }
{'A' }
[a,b]=ismember({'A'},gg)
a =
logical
1
b =
1
is not corret..i expect 1 1 0 1
  1 个评论
Stephen23
Stephen23 2024-10-13
"is not corret.."
It is correct: the first input 'A' is definitely a member of the second input:
ismember('A',{'A','A','B','A'})
ans = logical
1
"i expect 1 1 0 1"
ismember({'A','A','B','A'},'A')
ans = 1x4 logical array
1 1 0 1

请先登录,再进行评论。

采纳的回答

Sameer
Sameer 2024-10-13
编辑:Sameer 2024-10-13
Hi Luca
The "ismember" function is designed to work with arrays, and when using it with cell arrays of strings, it checks for membership of each element in the cell array. However, it returns a single logical value for the entire array when you provide a single element to check against the cell array.
To achieve the result you expect , you can use "strcmp" to compare each element in the cell array individually.
Here's how you can do it:
gg = {'A'; 'A'; 'B'; 'A'};
a = strcmp('A', gg);
disp(a);
1 1 0 1
Please refer to the below MathWorks documentation link:
Hope this helps!
  1 个评论
Walter Roberson
Walter Roberson 2024-10-13
[a,b]=ismember({'A'},gg)
answers the question of whether 'A' occurs in gg, as a yes or no answer in a and the index inside gg it occurs in b . {'A'} is a single element so you get a single answer.
[a,b]=ismember(gg, {'A'})
on the other hand iterates through the elements of gg, and for each one answers the question of whether the element occurs within {'A'} . gg is length 4 so the answer in a will be of length 4 -- [gg{1} is in {'A'}, gg{2} is in {'A'}, gg{3} is in {'A'}, gg{4} is in {'A'}] .

请先登录,再进行评论。

更多回答(2 个)

Pavl M.
Pavl M. 2024-10-13
gg = {'A' ,'A','B' ,'A' }
gg = 1x4 cell array
{'A'} {'A'} {'B'} {'A'}
a = cell2mat(gg)
a = 'AABA'
g = zeros(1,length(a));
g(find(a=='A')) = 1
g = 1×4
1 1 0 1
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
  7 个评论
Pavl M.
Pavl M. 2024-10-14
编辑:Pavl M. 2024-10-14
clc
clear all
close all
%% Inputs ( from a methode ):
ex = 'STA';
dd = { 'STA', 'STAT', 'STA', 'STATT' } ;
%% Detection module:
% contains(dd, 'STA') is not yet implemented as built-in in TCE Octave
if length(ex)>1
strcmp(dd,ex)
else
a = cell2mat(dd);
g = zeros(1,length(a));
g(find(a==ex)) = 1
end
ans = 1x4 logical array
1 0 1 0
Luca Re
Luca Re 2024-10-14
编辑:Luca Re 2024-10-14
ok but i think this solution is better: (solution of Sameer)
gg = {'AB'; 'AA'; 'BB'; 'AC'};
a = strcmp('AC', gg)
It has fewer lines of code..it seems faster to me

请先登录,再进行评论。


Steven Lord
Steven Lord 2024-10-13
Both outputs are the same size as the first input.
gg = {'A'; 'A'; 'B'; 'A'};
[a1,b1]=ismember({'A'},gg)
a1 = logical
1
b1 = 1
[a2, b2] = ismember(gg, {'A'})
a2 = 4x1 logical array
1 1 0 1
b2 = 4×1
1 1 0 1
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
  2 个评论
Steven Lord
Steven Lord 2024-10-14
Based on a revised example you posted as a comment on another answer, it looks like you're not trying to find cells in a cell array that are an exact match for a specific character. It looks like you're trying to find cells that contain that character anywhere inside the word they contain. If that is correct:
gg = { 'STA' , 'STAT' , 'STA' , 'STATT' }
gg = 1x4 cell array
{'STA'} {'STAT'} {'STA'} {'STATT'}
contains(gg, 'A')
ans = 1x4 logical array
1 1 1 1
gg{3} = 'STEM' % Replace one of the words with one not containing 'A'
gg = 1x4 cell array
{'STA'} {'STAT'} {'STEM'} {'STATT'}
contains(gg, 'A')
ans = 1x4 logical array
1 1 0 1
Or you could use other string related functions instead of contains. Some examples include startsWith and endsWith.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Tables 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by