【发布时间】: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,但这似乎也不起作用。谢谢。
编辑:作为预期结果的示例,如果我将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
【问题讨论】:
-
你能给我们展示一个示例输入和预期输出吗?
bsxfun可以使用任何尺寸输入,如果它是正确的形状 -
嗨 Suever,我已经更新了问题。请看一下。我希望这能澄清我要问的问题——我想要一个函数(如 bsxfun)来返回一个函数评估矩阵,而不是元素方式而是向量方式。输入向量列表(如第二个示例中的 x )会导致 bsxfun 崩溃,因为 x 和 x' 通常大小不同。此外,矩阵中的数字是错误的,而不是我正在寻找的机器人。
-
你在做过滤/卷积,对吧?
-
高斯过程,其实...
标签: arrays matlab matrix vector bsxfun