2017-07-07 66 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); 

这将打破,如果细胞具有坚韧的多个元素。