【问题标题】:Is there a bsxfun type function for vectors in Matlab?Matlab 中是否有用于向量的 bsxfun 类型函数?
【发布时间】:2016-12-10 00:16:49
【问题描述】:

具体来说,我正在尝试从一个核函数创建一个核矩阵,该核函数将向量作为输入并产生一个标量作为输出。因此,核矩阵是每对向量的此类输出的二维矩阵。

如果向量输入本身是一维的,我可以使用 bsxfun 来做到这一点:

x = [1;2;3;4]; kerfun = @(s,t) (s-t) % some function, doesn't matter, except that it returns a scalar kernel = bsxfun(kerfun, x, x');

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

kernel =

     0    -1    -2    -3
     1     0    -1    -2
     2     1     0    -1
     3     2     1     0

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

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

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

【问题讨论】:

  • 你能给我们展示一个示例输入和预期输出吗? bsxfun 可以使用任何尺寸输入,如果它是正确的形状
  • 嗨 Suever,我已经更新了问题。请看一下。我希望这能澄清我要问的问题——我想要一个函数(如 bsxfun)来返回一个函数评估矩阵,而不是元素方式而是向量方式。输入向量列表(如第二个示例中的 x )会导致 bsxfun 崩溃,因为 x 和 x' 通常大小不同。此外,矩阵中的数字是错误的,而不是我正在寻找的机器人。
  • 你在做过滤/卷积,对吧?
  • 高斯过程,其实...

标签: arrays matlab matrix vector bsxfun


【解决方案1】:

bsxfun 可以与 N 维数组一起使用,它会扩展它们的单例维度。但它在元素方面起作用。如果您想要一个沿行执行一些“聚合”操作的函数,例如您的示例,bsxfun 只能执行元素部分(使用单例扩展)。然后,您需要补充一些其他聚合函数以获得最终结果。

对于您示例中的特定情况,您想要的函数可以分解为逐元素减法(这是bsxfun 进入的地方),然后沿行求和(聚合部分),然后逐元素平方根。要使用bsxfun 进行减法运算,您需要将x 副本的第一个维度置换为第三个维度。这样一来,第一和第三维度跨越了两个循环中 ij 的所有组合。

然后沿生成的 3D 数组的第二维求和,取平方根,然后置换得到矩阵结果:

ker = sqrt(permute(sum(bsxfun(@minus, x, permute(x, [3 2 1])).^2, 2), [1 3 2]));

请注意,使用bsxfun 的内置函数之一(如此处的minus)比使用自定义函数更快。

对于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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多