将数字元胞数组转换为矩阵 (cell2mat),同时将空值转换为零
Convert cell array of numbers to matrix (cell2mat) while converting empties to zeros
我有一个函数,它在 cellfun
调用中使用 strfind
来查找元胞数组中的哪些字符串项与指定的字符串匹配。例如:
cellfun( @(x) strfind( x , 'openmask'), fileNames, 'uniformoutput', false)
原来的单元格矩阵是这样的:
fileNames = {'sub11att-openmask.txt', 'sub13det-masking', ...};
结果如下所示:
[10] [] [10] [] [9] []
我正在尝试找到一个可以将其转换为的函数:
10 0 10 0 9 0
使用 cell2mat
我得到:
10 10 9
所以我现在必须使用这个:
x(cellfun('isempty', x))={0};
cell2mat(x);
有没有比这更干净的函数(即单行解决方案)?
谢谢。
对于新变量 y
:
y(~cellfun('isempty', x)) = cell2mat(x);
如果一个单元格中有一种以上的坚韧元素,它就会破裂。
即使查找的字符串多次出现,此方法也有效。如果有的话,它会找到第一个这样的事件,否则给出 0
:
result = cellfun(@(x) sum(min(strfind(x, 'openmask'))), fileNames);
代码使用 min
保留第一次出现。这将给出一个数字或 []
。然后 sum
将 []
转换为 0
.
如果您希望保留最后一次出现,请将 min
更改为 max
或使用 Sardar Usama 的建议:
result = cellfun(@(x) max([0 strfind(x, 'openmask')]), fileNames);
我有一个函数,它在 cellfun
调用中使用 strfind
来查找元胞数组中的哪些字符串项与指定的字符串匹配。例如:
cellfun( @(x) strfind( x , 'openmask'), fileNames, 'uniformoutput', false)
原来的单元格矩阵是这样的:
fileNames = {'sub11att-openmask.txt', 'sub13det-masking', ...};
结果如下所示:
[10] [] [10] [] [9] []
我正在尝试找到一个可以将其转换为的函数:
10 0 10 0 9 0
使用 cell2mat
我得到:
10 10 9
所以我现在必须使用这个:
x(cellfun('isempty', x))={0};
cell2mat(x);
有没有比这更干净的函数(即单行解决方案)?
谢谢。
对于新变量 y
:
y(~cellfun('isempty', x)) = cell2mat(x);
如果一个单元格中有一种以上的坚韧元素,它就会破裂。
即使查找的字符串多次出现,此方法也有效。如果有的话,它会找到第一个这样的事件,否则给出 0
:
result = cellfun(@(x) sum(min(strfind(x, 'openmask'))), fileNames);
代码使用 min
保留第一次出现。这将给出一个数字或 []
。然后 sum
将 []
转换为 0
.
如果您希望保留最后一次出现,请将 min
更改为 max
或使用 Sardar Usama 的建议:
result = cellfun(@(x) max([0 strfind(x, 'openmask')]), fileNames);