多维数据存储和插值

时间:2017-11-22 16:02:26

标签: matlab interpolation

我有一个函数(可以这么说,我实际上有这个特征的数据)有一个变量x和几个参数abc,所以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(值只是为了澄清,这不是故意的二进制而且,数据列显然不一样了。)

这种数据格式只是我的数据采集方案的结果,但我很乐意将其更改为更有用的内容。无论什么都有效。

2 个答案:

答案 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 = 2b = 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