当输入数组大小不同时,我如何使用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。
i | j | 结果 |
---|---|---|
0 | 100 | 10|
0.1 | 100 | 10.1 |
0.2 | 100 | 10.2 |
0.3 | 100 | <1.03>|
0 | 105 | 10.24695077 |
0.1 | 105 | 10.25695077|
0.2 | 105 | 1026695077 |
0.3 | 105 | 10.27695077[/tr>|
0 | 110 | 10.4808848 |
etc | etc | etc |
这里的答案是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