2017-11-22 5 views
3

私はそうy = f(x, a, b, c)、一つの可変xといくつかのパラメータab及びcで(いわば、私は実際にこの特性を持つデータを持っている)機能を有しています。 今、私はパラメータのファミリ内で補間したいと考えています(例えば、バリエーションがaの場合)。多次元データストレージおよび補間

私は現在

% 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); 

これは正常に動作しますが、どのように私はより多くの次元にこれを拡張します(ここでは、yはデータ行列である)一つのパラメータとのデータのためにこれをやっていますか?

私の現在のデータフォーマットは次のようである:私のデータ行列の各列は、パラメータの一つの特定のセットを表すので、例えば:最初の列はa = 0, b = 0を示し

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

、第a = 1, b = 0、第a = 0, b = 1最後のa = 1, b = 1(値は説明のためのものですが、これは目的のバイナリではありません。また、データ列は明らかに同じではありません)。

このデータ形式は、データ取得方式の結果にすぎませんが、これをより便利なものに変更してうれしく思います。どんな作品でも。

答えて

1

が私に適しています:zlonの答え@

% 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); 
+0

が、これは素晴らしい作品、ありがとうございます!また、データを多次元行列に変換する方法を示す別の答えも提供しました。 – pschulz

+0

この回答はどこですか? – zlon

+0

申し訳ありませんが、それでも) – pschulz

0

は、補間部のために正常に動作し、ここで私は、補間のために必要なフォーマットに提供形式からデータを変換する方法を示したいと思います。

2次元マトリックスは、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 
関連する問題