2013-07-11 2 views
0

В Octave/MATLAB, что у меня есть:октава/MATLAB: создать новую матрицу на основе существования слов из одной матрицы в другую

all = 
{ 
    [1,1] = one 
    [1,2] = two 
    [1,3] = three 
    [1,4] = four 
    [1,5] = five 
    [1,6] = six 
    [1,7] = seven 
    [1,8] = eight 
    [1,9] = nine 
    [1,10] = ten 
} 

some = 
{ 
    [1,1] = someword 
    [1,2] = someword 
    [1,3] = one 
    [1,4] = someword 
    [1,5] = nine 
} 

Как бы я сделать новую матрицу таким образом, что

new = 
{ 
    [1,1] = 1 
    [1,2] = 0 
    [1,3] = 0 
    [1,4] = 0 
    [1,5] = 0 
    [1,6] = 0 
    [1,7] = 0 
    [1,8] = 0 
    [1,9] = 1 
    [1,10] = 0 
} 

то есть, new матрица имеет тот же размер, что и all матрицы, а значения являются либо 1 или 0, в зависимости от того, существуют ли слова в some в all?

ответ

1

Легко с для цикла:

new = cell(size(all)); 
for v=1:length(all) 
    if any(strcmp(some,all{v})) 
     new{v}=1; 
    else 
     new{v}=0; 
    end 
end 

В качестве альтернативы, вы можете использовать пересекаются:

[isect, index_all, index_some]=intersect(all,some); 

Если вам не нужны ваши новые значения будут ячейку (на ноль или один , нет никаких причин, чтобы не использовать простой массив), то это легко:

new=zeros(size(all)); 
new(index_all)=1; 

Если вам нужно, чтобы быть клетка для некоторых REAS на, а затем использовать:

new=num2cell(new); 

PS: вы should't использовать all в качестве имени переменной - это встроенная функция Matlab, и перезаписью с переменной, вы не можете использовать его, пока вы не очистите переменную.

+0

Я использовал ваше первое предложение, оно отлично работает! Спасибо чувак! Просто последующий вопрос. Если у меня есть другая матрица, называемая 'some2', и я применяю к ней один и тот же for-loop, чтобы получить те и нули, как бы добавить его в' новую' матрицу, так что теперь матрица 'new' будет иметь два столбца - сначала содержит 1s и 0s от' some', вторая содержит 1s и 0s от 'some2'? – Obay

+0

Вы можете сгенерировать выход new2 и использовать 'new_combined = new | new2;', чтобы получить ненулевые значения от обоих. –

+0

Я получаю 'error: binary operator '|' не реализовано для 'cell' операциями 'cell' – Obay

2

Использование

new = ismember(all, some); 

Это возвращает массив. Но если вы хотите его в массив ячеек можно использовать

new = num2cell(ismember(all, some)); 

Однако, как Хью Нолан упомянул в своем ответе, это, как правило, хорошая идея, чтобы избежать имя встроенной функции, такие как all как имена переменных.

+0

Это лучший ответ, чем цикл for! –

Смежные вопросы