为A中的行和B中的列的每个组合调用函数

2次浏览(过去30天)
Xtrain = [1 2;3 4;5 6];
Xtest = [7 8;9 10];
Kernel = @(x1,x2)范数(x1 - x2);
m = size(Xtrain, 1);
n = size(Xtest,1);
kernels = kernel(Xtest, Xtrain);
我希望“内核”是以下矩阵:
kernel = [kernel([7 8],[1 2]) kernel([7 8],[3 4]) kernel([7 8],[5 6])
内核(10[9],[1 - 2])内核(10[9],[3 - 4])内核(10 [9],[5 - 6]))
如何正确调用核函数才能得到这个矩阵?
谢谢你!

接受的答案

埃米尔哈姆萨
埃米尔哈姆萨 2020年12月30日
试试这个
Xtrain = [1 2;3 4;5 6];
Xtest = [7 8;9 10];
Kernel = @(x1,x2)范数(x1 - x2);
m = size(Xtrain, 1);
n = size(Xtest, 1);
XtrainC = mat2cell(Xtrain, ones(m,1), 2);
XtestC = mat2cell(Xtest, ones(n,1), 2);
[R, C] = ndgrid(1:n, 1:m);
Kernels = arrayfun@(r, c)内核(XtestC{r}, XtrainC{c}), r, c

更多答案(1)

布鲁诺陈德良
布鲁诺陈德良 2020年12月30日
编辑:布鲁诺陈德良 2020年12月30日
简单的for循环比花哨的MATLAB伪向量化快3-4倍,而且可读性更强
Xtrain = rand(1000,2);
Xtest = rand(1000,2);
Kernel = @(x1,x2)范数(x1 - x2);
m = size(Xtest,1);
n = size(Xtrain,1);
抽搐
内核= 0 (m,n);
i = 1: m
j = 1: n
kernels(i,j) = kernel(Xtest(i,:),Xtrain(j,:));
结束
结束
toc%运行时间为1.389989秒。
抽搐
XtrainC = mat2cell(Xtrain, ones(m,1), 2);
XtestC = mat2cell(Xtest, ones(n,1), 2);
[R, C] = ndgrid(1:n, 1:m);
kernels = arrayfun(@(r, c) kernel(XtestC{r}, XtrainC{c}), r, c);
toc%运行时间为5.821724秒。

标签

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!