Arrays Matlab中是否有用于向量的bsxfun类型函数?

Arrays Matlab中是否有用于向量的bsxfun类型函数?,arrays,matlab,matrix,vector,bsxfun,Arrays,Matlab,Matrix,Vector,Bsxfun,具体地说,我试图从一个核函数中创建一个核矩阵,该核函数将向量作为输入,并生成一个标量作为输出。因此,核矩阵是每对向量的此类输出的2D矩阵的一个矩阵 在向量输入本身为1D的情况下,我可以使用bsxfun来实现这一点: x=[1;2;3;4]; kerfun=@(s,t)(s-t)%some函数,除了返回标量外,其他都无关紧要 kernel=bsxfun(kerfun,x,x'); 正如预期的那样,输出是内核: kernel = 0 -1 -2 -3 1

具体地说,我试图从一个核函数中创建一个核矩阵,该核函数将向量作为输入,并生成一个标量作为输出。因此,核矩阵是每对向量的此类输出的2D矩阵的一个矩阵

在向量输入本身为1D的情况下,我可以使用bsxfun来实现这一点:

x=[1;2;3;4];
kerfun=@(s,t)(s-t)%some函数,除了返回标量外,其他都无关紧要
kernel=bsxfun(kerfun,x,x');

正如预期的那样,输出是内核:

kernel =

     0    -1    -2    -3
     1     0    -1    -2
     2     1     0    -1
     3     2     1     0
但是,如果我将
x
中的点更改为N-D向量,这种方法将失败。我的问题是:有没有一种有效的方法来构造内核矩阵而不使用循环?我试着使用cellfun,但似乎也不起作用。谢谢

编辑:作为预期结果的示例,如果我将
x
kerfun
更改如下:

x = [1,15;23,2;13,5;4,7];
kerfun = @(s,t) norm(s-t); %some function, returns a scalar
ker = zeros(4,4);
然后使用蛮力计算内核:

for i=1:size(x,1)
    for j=1:size(x,1)
        ker(i,j) = kerfun(x(i,:),x(j,:));
    end
end
我得到:

ker =

         0   25.5539   15.6205    8.5440
   25.5539         0   10.4403   19.6469
   15.6205   10.4403         0    9.2195
    8.5440   19.6469    9.2195         0
可以与N维数组一起使用,它将扩展它们的单态维度。但它在元素方面起作用。如果希望函数沿行执行某些“聚合”操作,如示例中所示,
bsxfun
只能执行元素部分(使用单例扩展)。然后需要使用其他聚合函数进行补充,以获得最终结果

对于示例中的特定情况,可以将所需函数分解为元素减法(此处是
bsxfun
的输入),然后沿行求和(聚合部分),然后是元素平方根。要使用
bsxfun
执行减法,需要将
x
副本的第一个维度排列到第三个维度上。这样一来,第一维度和第三维度就跨越了两个循环中
i
j
的所有组合

然后沿生成的三维阵列的第二维度求和,取平方根,然后重新排列,得到矩阵结果:

ker = sqrt(permute(sum(bsxfun(@minus, x, permute(x, [3 2 1])).^2, 2), [1 3 2]));
请注意,使用
bsxfun
的一个内置函数(如这里的
减号
)比使用自定义函数更快

对于
x=[1,15;23,2;13,5;4,7]

ker =
         0   25.5539   15.6205    8.5440
   25.5539         0   10.4403   19.6469
   15.6205   10.4403         0    9.2195
    8.5440   19.6469    9.2195         0

你能给我们举一个输入和预期输出的例子吗
bsxfun
可以处理任何尺寸输入,如果它是正确的形状。不管怎样,我已经更新了问题的答案。现在请看一看。我希望这能澄清我要问的问题——我希望函数(如bsxfun)返回函数求值矩阵,不是按元素而是按向量。馈送向量列表(如第二个示例中的x)会导致bsxfun崩溃,因为x和x'通常大小不同。此外,矩阵中的数字可能是错误的,而不是我要找的机器人。你在做滤波/卷积,对吗?实际上是高斯过程。。。