MATLAB:将 cellfun 与多级元胞数组结合使用
MATLAB: Using cellfun with multi level cell array
我有一个多级元胞数组。各个级别的大小可能不同。我想知道如何将 cellfun
应用到最低级别。设想以下多级元胞数组:
a = {randi(10,5,1), randi(5,5,1)}
b = randi(100,5,1,10)
f = {a,b}
现在,我想尽可能地向下钻取,并将 cellfun
应用到 f
的最深层次。在每一层,都有一个 2D/3D 矩阵。比方说,我只想给每个值加 5。什么是最有效的方法?
这是我要查找的结果。
[a_nRows, a_nCols, a_nPages] = size(a)
x = cellfun(@plus, f{1}, repmat({5}, a_nRows, a_nCols, a_nPages), 'UniformOutput', false)
y = cellfun(@plus, f(2), {5}, 'UniformOutput', false)
您可以为此使用递归。
首先,定义一个函数来做两件事之一
- 如果输入是数字矩阵,应用一些操作。
- 如果输入是一个单元格,调用这个相同的函数,将单元格的内容作为输入。
该函数看起来像这样(在本地定义到另一个函数或在它自己的 m 文件中):
function out = myfunc( in, op )
if iscell( in )
out = cellfun( @(x) myfunc(x, op), in, 'UniformOutput', false );
elseif isnumeric( in )
out = op( in );
else
error( 'Cell contents must be numeric or cell!' )
end
end
然后您可以拨打您的手机myfunc
。这是一个类似于您的示例:
a = {[1 2; 3 4], {eye(2), 10}}; % Nested cell arrays with numeric contents
op = @(M) M + 5; % Some operation to apply to all numeric contents
myfunc( a, op )
% >> ans =
% { [6 7; 8 9], {[6 5; 5 6], 15}}
直接使用您的示例,myfunc(f, @(M)M+5)
的输出与您的 {x, y{1}}
相同 - 即操作 op
应用于每个单元格和嵌套单元格,结果结构为与输入相同。
我有一个多级元胞数组。各个级别的大小可能不同。我想知道如何将 cellfun
应用到最低级别。设想以下多级元胞数组:
a = {randi(10,5,1), randi(5,5,1)}
b = randi(100,5,1,10)
f = {a,b}
现在,我想尽可能地向下钻取,并将 cellfun
应用到 f
的最深层次。在每一层,都有一个 2D/3D 矩阵。比方说,我只想给每个值加 5。什么是最有效的方法?
这是我要查找的结果。
[a_nRows, a_nCols, a_nPages] = size(a)
x = cellfun(@plus, f{1}, repmat({5}, a_nRows, a_nCols, a_nPages), 'UniformOutput', false)
y = cellfun(@plus, f(2), {5}, 'UniformOutput', false)
您可以为此使用递归。
首先,定义一个函数来做两件事之一
- 如果输入是数字矩阵,应用一些操作。
- 如果输入是一个单元格,调用这个相同的函数,将单元格的内容作为输入。
该函数看起来像这样(在本地定义到另一个函数或在它自己的 m 文件中):
function out = myfunc( in, op )
if iscell( in )
out = cellfun( @(x) myfunc(x, op), in, 'UniformOutput', false );
elseif isnumeric( in )
out = op( in );
else
error( 'Cell contents must be numeric or cell!' )
end
end
然后您可以拨打您的手机myfunc
。这是一个类似于您的示例:
a = {[1 2; 3 4], {eye(2), 10}}; % Nested cell arrays with numeric contents
op = @(M) M + 5; % Some operation to apply to all numeric contents
myfunc( a, op )
% >> ans =
% { [6 7; 8 9], {[6 5; 5 6], 15}}
直接使用您的示例,myfunc(f, @(M)M+5)
的输出与您的 {x, y{1}}
相同 - 即操作 op
应用于每个单元格和嵌套单元格,结果结构为与输入相同。