Matlab bsxfun不';t在常数函数上不能像我期望的那样工作
在Matlab R2016a中,我有一大组成对的小X向量和Y向量(例如,10000个1x3 X向量与10000个1x3 Y向量成对)。对于每个{X,Y}对,我想为X和Y中元素的每个成对组合计算一个2标量参数函数(因此在我的示例中,我将得到10000个3x3矩阵) 我想我可以使用bsxfun来执行这些计算,但当我尝试做一些简单的测试时,它不起作用Matlab bsxfun不';t在常数函数上不能像我期望的那样工作,matlab,Matlab,在Matlab R2016a中,我有一大组成对的小X向量和Y向量(例如,10000个1x3 X向量与10000个1x3 Y向量成对)。对于每个{X,Y}对,我想为X和Y中元素的每个成对组合计算一个2标量参数函数(因此在我的示例中,我将得到10000个3x3矩阵) 我想我可以使用bsxfun来执行这些计算,但当我尝试做一些简单的测试时,它不起作用bsxfun(@(x,y)x*y,[12],[12])返回: ans = 1 2 2 4 Error using
bsxfun(@(x,y)x*y,[12],[12])
返回:
ans =
1 2
2 4
Error using bsxfun
Specified function handle produces invalid output dimensions. The function handle
must be a binary elementwise function.
这正是我所期望的。但是,bsxfun(@(x,y)1,[12],[12]”)返回:
ans =
1 2
2 4
Error using bsxfun
Specified function handle produces invalid output dimensions. The function handle
must be a binary elementwise function.
这毫无意义。函数句柄是一个二进制元素级函数,总是返回标量1,因此bsxfun
应该给出与的(2,2)
相同的结果,除非我不理解bsxfun
是如何工作的。传递给bsxfun
的函数句柄的输入不是标量。在R2016b之前的版本中,输入为标量或大小相同
FUNC
也可以是未列出的任何二进制元素函数的句柄
在上面以C=FUNC(A,B)
接受大小任意但相等的数组A
和B
,并返回输出
大小相同的。输出数组C
中的每个元素都是结果
仅对A
和B
的相应元素执行操作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
如果要为每个条目返回1
,则需要将函数替换为生成适当大小输出的函数
bsxfun(@(x,y)ones(max(size(x), size(y))), [1 2], [1 2]')
如何构造函数句柄实际上取决于您的具体问题我的代码还没有达到这个程度。我通常喜欢在花下一个小时编写依赖于我没有使用过的函数的代码之前让测试用例工作,并引用文档:“形式为C=fun(a,B)的二进制元素函数接受任意大小但大小相同的数组a和B,并返回大小相同的输出。”,参数大小不一样[12]
是1x2,而[12]'
是2x1,但它适用于@(x,y)x*y
还有,为什么最大?它不应该仅仅是bsxfun(@(x,y)个(大小(y)),[12],[12])
?@Frank,max
支持标量扩展的情况(请阅读文档!)。例如,如果y
是标量,而x
是向量,则函数将失败,因为它将返回与x
大小相同的输出。如果您转换输入维度,您很容易看到示例失败:bsxfun(@(x,y)one(size(y)),[12],[12])
@Frank Right它适用于x*y
,因为在这种情况下x
是标量,y
是2x1
。是的,你可以按照你在这个具体例子中的建议去做,但是我正在写一个例子,不管输入是什么,都会返回一个。