2015-11-27 8 views
0

Вот некоторые данные.Как сделать A == B callmemember (A, B) в Matlab, когда A и B являются массивами ячеек

A = {'asdf' 'qwer'}; 

Когда я использую ==, я получаю

>> A == 'asdf' 
Undefined operator '==' for input arguments of type 'cell'. 

, который, как ожидается. Обойти это сделать

>> ismember(A, 'asdf') 

ans = 

    1  0 

Как добавить метод класса клеток, так что == по умолчанию вызова ismember в приведенном выше способом?

+1

Я бы не назвал 'ismember' обходным путем, я бы назвал его каноническим способом сделать это. Это имеет другое значение для '=='. Я не думаю, что вы можете перегрузить оператор '==' в MATLAB (я точно не знаю, хотя), но я думаю, что это плохая идея. Вы сделаете свой код менее многоразовым, менее читаемым для других, присоединяющихся к проекту и т. Д. – Dan

ответ

2

Вы можете перегрузить @eq для массивов ячеек, следуя объяснениям in this answer.

Почему это плохая идея? ismember работает только в том случае, если в массиве ячеек есть строки, но не другие типы данных. Кроме того, это сделает ваш код не переносимым, например, я бы не хотел использовать код, который перегружает операторов для встроенных типов данных.

Если вы действительно хотите иметь тип данных клеточно-массив типа, где вы можете использовать в качестве @eqismember, вы можете создать свой собственный класс myCellArray что подклассы cell и гарантирует, что каждый элемент содержит строку. Затем вы можете перегружать операторы, которые вы хотите.

+1

Я думаю, что было бы возможно перегрузить @eq для 'cell', а не для других классов, если вы поместите его в папку @cell. Тем не менее, я бы порекомендовал его так же мало, как и вы. Встроенные типы как «cell» должны иметь одинаковое поведение на всех машинах. – patrik

+0

Спасибо за ссылку. Это то, что я буду делать. Код предназначен только для личного удобства. Выполняя перегрузку, я брошу предупреждение, которое скажет: «== не определено для ячейки, используя пользовательскую процедуру» или что-то в этом роде, что напомнит мне не делать этого для кода, который я намерен разделить. – Alex

1

Если вы хотите, чтобы проверить, является ли строка 'asdf' в массиве ячеек {'asdf','qwer'}, вы, вероятно, следует использовать ismember функцию:

my_set = {'asdf','qwer'}; 
logical_result = ismember('asdf',my_set); 

Там будут основные стилистические проблемы с делать то, что вы предлагаете:

  1. Определение оператора == таким образом, что оно не является рефлексивным (то есть A==A возвращает false) и не является симметричным (A==B - это не то же самое, что и B==A) странно.
  2. Ваш код не будет переносимым, так как потребуются люди, взломавшие их def. массива ячеек. Почти никто не захочет этого делать.
  3. Изменение кода для массива ячеек может привести к запутыванию ошибок в строке.
  4. В качестве альтернативы, можно использовать время и усилия для написания собственного класса оболочки/замены класса ячеек, но это будет ужасная трата времени и бесполезно медленная.
Смежные вопросы