2013-07-11 40 views
0

在八度/ 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矩陣的大小相同,但其值爲10,具體取決於中的單詞是否存在於all

回答

1
用一個for循環

輕鬆:

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應用於它以得到1和0,我將如何將它添加到'new'矩陣,以便現在,'新'矩陣將有兩列 - 第一個包含1s和0s來自'some',第二個包含1s和0s來自'some2'? – Obay

+0

您可以生成一個new2輸出,並使用'new_combined = new | new2;'從兩者中獲取非零值。 –

+0

我得到'error:binary operator'|' 'cell'operations'not'for'cell' – Obay

2

使用

new = ismember(all, some); 

這將返回一個數組。但是,如果你想在一個單元陣列可以使用

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

然而,正如休·諾蘭在他的回答中提到,這通常是爲了避免內置函數的名稱,如all變量名是個好主意。

+0

這是一個比for循環更好的答案! –