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

Fra*_*ank 3 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
Run Code Online (Sandbox Code Playgroud)

这是我期望的.但是,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.
Run Code Online (Sandbox Code Playgroud)

这毫无意义.函数句柄一个二元元素函数,它总是返回标量1,所以bsxfun应该给出相同的结果ones(2,2),除非我不理解它是如何bsxfun工作的.

Sue*_*ver 5

传递给函数句柄的输入bsxfun 不是标量.在早于R2016b版本中,输入是任一标量,或者它们具有相同的尺寸.

FUNC也可以是上面没有列出的任何二元元素函数的句柄.在形式的二进制元素分段函数C = FUNC(A,B) 接受数组AB任意的,但大小相等,并且返回相同大小的输出.输出阵列中的每个元素C是上的对应元件的操作的结果AB只.FUNC还必须支持标量扩展,这样如果A或者B是标量,C则是将标量应用于另一个输入数组中的每个元素的结果.

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

在您显示的示例中,函数句柄的第一个输入是标量,第二个是向量(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
Run Code Online (Sandbox Code Playgroud)

如果要1为每个条目返回a ,则需要将某个函数替换为产生适当大小的输出的函数.

bsxfun(@(x,y)ones(max(size(x), size(y))), [1 2], [1 2]')
Run Code Online (Sandbox Code Playgroud)

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