2017-07-07 72 views
1

我有一個函數,它使用strfind調用cellfun來查找單元格數組中的哪些字符串項匹配指定的字符串。例如:將空格的單元格數組轉換爲矩陣(cell2mat),同時將空格轉換爲零

cellfun(@(x) strfind(x , 'openmask'), fileNames, 'uniformoutput', false) 

的原始細胞矩陣是這樣的:

fileNames = {'sub11att-openmask.txt', 'sub13det-masking', ...}; 

這樣做的結果是這樣的:

[10] [] [10] [] [9] [] 

我試圖找到將轉換功能這對:

10 0 10 0 9 0 

Usin摹cell2mat我得到:

10 10 9 

所以,我必須現在使用此:

x(cellfun('isempty', x))={0}; 
cell2mat(x); 

是否有一個功能比這更清潔(即單線解決方案)?

謝謝。

+1

定期爲空細胞始終? –

+0

@SardarUsama不,他們不是 – teepee

回答

3

即使找到的字符串有多處出現,它也能正常工作。它發現第一個事故發生,如果有任何,或給予0否則:

result = cellfun(@(x) sum(min(strfind(x, 'openmask'))), fileNames); 

代碼使用min保持第一的發生。這將給出一個數字或[]。然後sum[]轉換爲0

如果您喜歡在最後一次出現,改變minmax或使用Sardar Usama的建議:

result = cellfun(@(x) max([0 strfind(x, 'openmask')]), fileNames); 
+1

擺脫'sum'函數的想法:'result = cellfun(@(x)max([0 strfind(x,'openmask')]),fileNames)' –

+0

Very花式手工@LuisMendo。謝謝你。順便說一句,組織用戶定義函數庫的最佳方法是什麼,以便我寫入的任何MATLAB腳本訪問?我想開始收集這樣的功能,這些功能非常方便,我需要爲各種事情使用一堆功能。謝謝! – teepee

+0

@teepee嗯我不確定,我只是保留一個或兩個文件夾與他們所有人。您可以在['startup'文件](https://es.mathworks.com/help/matlab/ref/startup.html)中添加一行[添加路徑](https://es.mathworks。 com/help/matlab/ref/addpath.html)到這些文件夾。很高興你找到有用的答案! –

1

對於一個新的變量y

y(~cellfun('isempty', x)) = cell2mat(x); 

這將打破,如果細胞具有堅韌的多個元素。