2015-03-06 5 views
1

В Matlab у меня есть следующие две структуры данных b и c, определенные следующим образом.Как использовать член Matlab в структурах данных с несколькими вложенными полями?

b(1).b = struct('c',{'a', 'b', 'c'}) 
c(1).b = struct('c',{'b', 'a', 'c'}) 

Теперь я хочу использовать ismember, чтобы выяснить, если элементы Ь (1) .bc содержатся в с (1) .bc и если да, то какие индексы с (1) .bc каждого из элементы принадлежат.

Например: b(1).b(1).c = a, я хочу трассировку это структурировать c найти какой индекс структуры c «а» принадлежит (она должна возвращать 2, так как «а» является вторым элементом структуры c).

Я попытался

[~, ind] = ismember({b(1).b.c},{c(1).b.c}) 

, который работал для меня ранее с другой структурой данных, но теперь я получаю следующее сообщение об ошибке:

*Error using cell/ismember>cellismemberR2012a (line 192) 
Input A of class cell and input B of class cell must be cell arrays of  strings, unless one is a string. 
Error in cell/ismember (line 56) 
[varargout{1:max(1,nargout)}] = cellismemberR2012a(A,B);* 

Я не знаю, почему он не работает. Кто-нибудь знает, как это исправить? Спасибо.

+1

Использование вашего точного кода в R2011a (версия 7.12.0.635) работает так, как вы ожидаете дать [2 1 3]. Какую версию Matlab вы используете? – TallBrianL

+1

Интересно, это также сработало и для меня – madbitloman

+1

Прекрасно в 2012b. Существуют ли какие-либо другие переменные в рабочем пространстве Matlab, которые могут быть противоречивыми? (Например, существует ли уже структура 'b'?) – David

ответ

0

Я нашел для работы следующее.

Первое назначение b(1).b.c в массив S, а затем сравнивая, что со структурой c данных с использованием ismember.

S = [b(1).b.c] 
S = S' 
[~, ind] = ismember(S,{c(1).b.c}) 

Я нашел это для работы.

Кроме того,

[~, ind] = ismember([b(1).b.c}],[c(1).b.c]) 

не дает ошибку, но все значения в ind являются zero, которая не относится к данным.

Спасибо всем за ваш ввод!

0

погуглить вокруг не показали каких-либо возможных решений, но есть пара вариантов:

[~, ind] = ismember([{b(1).b.c}],[{c(1).b.c}]) 

и литье в массив ячеек:

[~,idx]=ismember(struct2cell(b(1).b),struct2cell(c(1).b)) 
idx=reshape(idx,1,3); 

Для обоих выхода должно быть:

2 1 3 
+0

Я все еще получаю ту же ошибку ... и используя struct2cell, я получаю ошибку 'Undefined function 'struct2cell' для входных аргументов типа 'cell' .' –