bsxfun不能像我期望的那样在常量函数上运行

时间:2017-01-08 19:34:29

标签: matlab

在Matlab R2016a中,我有一大组小X-载体和Y-载体成对(例如10,000个1x3 X载体与10,000个1x3 Y载体配对)。对于每个{X,Y}对,我想为X和Y中的元素的每个成对组合计算一个2标量参数函数(因此在我的示例中,我将获得10,000个3x3矩阵)。

我以为我可以使用bsxfun来执行这些计算,但是当我尝试做一些简单的测试时它不起作用。 bsxfun(@(x,y) x*y,[1 2],[1 2]')返回:

ans =

     1     2
     2     4

这是我所期待的。但是,bsxfun(@(x,y) 1,[1 2],[1 2]')会返回:

Error using bsxfun
Specified function handle produces invalid output dimensions. The function handle
must be a binary elementwise function.

这没有任何意义。函数句柄二元元素函数,它总是返回标量1,因此bsxfun应该给出与ones(2,2)相同的结果,除非我不理解{{1}工作。

1 个答案:

答案 0 :(得分:5)

传递给bsxfun 的函数句柄的输入不是标量。在R2016b之前的版本中,输入 标量或它们的大小相同。

  

FUNC也可以是未列出的任何二元元素功能的句柄       以上。 C = FUNC(A,B)形式的二元元素函数       接受任意但相等大小的数组AB返回输出       大小相同。输出数组C中的每个元素都是结果       仅对AB的相应元素执行操作的操作。 FUNC必须       还支持标量扩展,如果AB是标量,则C是       将标量应用于另一个输入数组中的每个元素的结果

在自R2016b以来的版本中,它们不必是相同的大小,但应该是compatible sizes

在您显示的示例中,函数句柄的第一个输入是标量,第二个是向量(y),并且对x的每个元素计算函数,并且输出应该是y

的大小

在您发布的情况下,对bsxfun的调用基本上等同于:

x = [1 2];
y = [1 2].';

yourfunc = @(x,y)x * y;

for k = 1:numel(x)
    output(:,k) = yourfunc(x(k), y)
end

如果你想为每个条目返回一个1,你需要用产生适当大小的输出的东西替换你的函数。

bsxfun(@(x,y)ones(max(size(x), size(y))), [1 2], [1 2]')

如何制定功能句柄实际上取决于您的具体问题