具有不同大小输入数组的MatLab cell Fun

mkshixfv  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(167)

当输入数组大小不同时,如何使用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

本例的预期输出是下面的“Result”列;为方便起见,这里显示了i和j。
I|j|结果
-|-|
0|100|10
0.1|100|10.01
0.2|100|10.02
0.3|100|10.03
0|105|10.24695077
0.1|105|10.25695077
0.2|105|10.26695077
0.3|105|10.27695077
0|110|10.48808848
ETC|ETC|ETC

nuypyhwy

nuypyhwy1#

这里的答案是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

相关问题