2017-03-08 63 views
2

我有一個函數將一個向量作爲輸入,使用另一個函數從輸入創建一個導數向量,然後將兩個向量與產生它的輸出向量。我現在有將其與工作循環如下:使用矩陣運算而不是FOR循環將單元格數組與索引值進行布爾比較

原始陣列,nameVec,用作輸入到以下功能:

% INPUT: nameVec = '' 'a' 'b' 'aa' 'ab' 'ba' 'aba' 'abb' 

首先,將稱爲computeParentName函數從移除的最後一個字符的nameVec和每個陣列元件產生此單元陣列:

% OUTPUT: parentNameVec = '' '' '' 'a' 'a' 'b' 'ab' 'ab 

接下來,函數computeParentIndex發現的其中parentNameVec每個元素出現在的索引:

function [parentIndexVec] = computeParentIndex(nameVec) 
    parentNameVec = computeParentName(nameVec); 
    [~,parentIndexVec] = ismember(parentNameVec, nameVec); 
end  
% OUTPUT: parentIndexVec = 1  1  1  2  2  3  5  5 

現在我試圖開發基本上起反向的功能,因爲它需要nameVec並輸出的單元陣列,它包含每個索引處,所有索引的在parentNameVec陣列,其中的值是該輸出數組('daughterIndexVec`)當前索引

function [daughterIndexVec] = computeDaughterIndex(nameVec) 
    parentIndexVec = computeParentIndex(nameVec); 
    for i=1:length(parentIndexVec) 
     daughterIndexVec{i} = find(parentIndexVec==i); 
    end 
end 
% OUTPUT: daughterIndexVec = {[1,2,3] [4,5] [6] [] [7,8] [] [] []} 

的有沒有更簡單(更有效)的方式來做到這一點不使用for循環?

任何援助非常感謝!

回答

2

可以使用的ismember第二輸出得到的每個值的位置在parentNameVecnameVec,然後在nameVec在單元陣列使用來accumarray組共享相同指數的所有索引在一起。

[~, ind] = ismember(parentNameVec, nameVec); 
daughterIndexVec = accumarray(ind(:), 1:numel(ind), [numel(ind) 1], @(x){x.'}); 
% {[1,2,3] [4,5] [6] [] [7,8] [] [] []} 
+0

再次感謝!我在這裏學習的非常有用的功能。那麼'accumarray'會比for循環更快嗎(即不像'arrayfun'和'cellfun')? – teepee

+0

@teepee是的。 'accumarray'非常快。你可以使用'timeit'函數自己測試速度 – Suever

+0

對我來說看起來不錯,但是當我運行它時出現一個奇怪的錯誤: '使用accumarray時出錯 當SUBS是列向量時,第三個輸入SZ必須是的形式[N 1] .'我不確定這裏有什麼詭異的... – teepee

相關問題