具有不同大小输入数组的Matlab cellfun

  • 本文关键字:数组 Matlab cellfun matlab
  • 更新时间 :
  • 英文 :


当输入数组大小不同时,我如何使用cellfun(或适当的替代方案(,并获得所有结果组合(即,评估数组的交叉连接(?

此示例使用了一个伪函数;实际的函数更复杂,所以我正在寻找调用自定义函数的答案。使用Matlab R2018a,所以我正在寻找一个与之兼容的答案。

a = 0:0.1:0.3; b = 100:5:120;
test = cellfun(@(x,y) myfunc(x,y,0), num2cell(a), num2cell(b));
function [result] = myfunc(i, j, k)
% k is needed as fixed adjustment in "real life function"
result = 0.1 * i + sqrt(j) + k;
end

上述代码返回以下错误:

Error using cellfun
All of the input arguments must be of the same size and shape.
Previous inputs had size 4 in dimension 2. Input #3 has size 5

这个例子的预期输出是";结果";下面的列;为了方便起见,示出了i和j。

10<1.03>10.2569507710.27695077[/tr>
ij结果
0100
0.110010.1
0.210010.2
0.3100
010510.24695077
0.1105
0.21051026695077
0.3105
011010.4808848
etcetcetc

这里的答案是bsxfun。下面是一个示例。

% You need a function with the correct number of inputs.
% With your sample, I would do something like this.
myfunc       = @(i,j,k) 0.1 * i + sqrt(j) + k;
myfunc_inner = @(i,j) myfunc(i,j,0);
%    Side not: using separate files for functions is more 
%    efficient, but makes for worse examples on stackoverflow
%Setting up the inputs    
a = 0:0.1:0.3;
b = 100:5:120;
%bsxfun, for two inputs, is called like this.
c = bsxfun(myfunc_inner, a', b)

bsxfun执行以下操作:

  • 扩展输入的标量维度,使其匹配
  • 使用提供的函数输入执行输入的元素组合

在这种情况下,结果是:

c =
10       10.247       10.488       10.724       10.954
10.01       10.257       10.498       10.734       10.964
10.02       10.267       10.508       10.744       10.974
10.03       10.277       10.518       10.754       10.984

要获得所需表单中的输入,只需运行c(:)即可。


历史注释:

回到从前,我们不得不更频繁地使用bsxfun。现在,当我们对数字进行简单运算时,Matlab会在没有注意的情况下扩展单个维度。例如,我过去经常使用以下样式:

a = [1 2 3];
b = [4 5 6];
c = bsxfun(@plus, a', b)

而现在我们只写:

c = a' + b

相关内容

  • 没有找到相关文章

最新更新