我有一个函数(可以这么说,我实际上有这个特征的数据)有一个变量x
和几个参数a
,b
和c
,所以y = f(x, a, b, c)
。
现在我想在参数族中进行插值(例如,a
的变体。)
我目前正在为具有一个参数的数据执行此操作(此处,y
是数据矩阵)
% generate variable and data
x = linspace(0, 1, 100);
a = [0, 1]; % parameter
for i = 1:length(a)
y(:, i) = x.^2 + a(i);
end
% interpolate:
yi = interp1(a, y.', 0.5);
这很好用,但我该如何将其扩展到更多尺寸?
我当前的数据格式是这样的:我的数据矩阵的每一列代表一组特定的参数,例如:
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
其中第一列表示a = 0, b = 0
,第二列表示a = 1, b = 0
,第三列表示a = 0, b = 1
,最后一个a = 1, b = 1
(值只是为了澄清,这不是故意的二进制而且,数据列显然不一样了。)
这种数据格式只是我的数据采集方案的结果,但我很乐意将其更改为更有用的内容。无论什么都有效。
答案 0 :(得分:1)
适合我:
% generate variable and data
x = linspace(0, 1, 100);
a = [0, 1, 2]; % parameter
b = [3, 4, 5]; % parameter
c = [6, 7, 8]; % parameter
% Create grid
[X,A,B,C]=ndgrid(x,a,b,c);
% define function
foo = @(x,p1,p2,p3) p1.*x.^2 + p2.*x + p3;
% evaluate function
Y = foo(X,A,B,C);
% interpolate:
yi = interpn(X,A,B,C,Y,x,1,4,6);
答案 1 :(得分:0)
@ zlon的答案适用于插值部分,这里我想说明如何将数据从我提供的格式转换为插值所需的格式。
必须将二维矩阵转换为N维矩阵。由于列不一定是有序的,我们需要找到正确的列。这就是我所做的:
首先,我们需要知道每列的参数集:
a = [ 2, 2, 1, 0, 0, 1 ];
b = [ 1, 0, 0, 1, 0, 1 ];
这些向量长度与数据矩阵中的列数相匹配。例如,第一列现在包含a = 2
和b = 1
的数据。
现在我们可以生成新表:
A = -Inf;
i = 1;
while true
A = min(a(a > A)); % find next a
if isempty(A)
break
end
idxa = find(a == A); % store possible indices
B = -Inf;
j = 1;
while true
B = min(b(b > B))); % find next b
if isempty(B)
break
end
idxb = find(b == B); % store possible indices
% combine both indices
idx = intersect(idxa, idxb);
% save column in new data table
data(:, i, j) = olddata(:, idx);
% advance
j = j + 1;
end
i = i + 1;
end