反转一系列数据,就像使用 MATLAB 反转函数一样

Invert a series of data as if inverting a function using MATLAB

是否可以"invert"函数反转时的一系列数据?

让我解释一下。如果我有一个可以在 MATLAB 中绘制的函数,我总是(几乎)可以用 finverse 找到这种函数的反函数,并且绘图会提供:

但是我的数据没有a函数,我还是想找到这样一系列数据的逆函数,比如y=f(x) where

x=[0.0050879   0.0056528   0.0062176   0.0067822   0.0073467   0.0079111   0.0084752   0.0090392   0.0096030   0.0101666   0.0107299   0.0112930   0.0118558   0.0124184   0.0129807   0.0135428   0.0141045   0.0146659   0.0152270   0.0157877   0.0163481];

y=[0.0000e+00   0.0000e+00   0.0000e+00   0.0000e+00   0.0000e+00   0.0000e+00   0.0000e+00   0.0000e+00   0.0000e+00   0.0000e+00   4.4901e-05   4.4901e-05   8.9801e-05   1.3470e-04   1.7960e-04   2.2450e-04   2.6940e-04   3.5920e-04   4.0411e-04   4.9391e-04   5.8371e-04];

在MATLAB中可以对一系列数据进行这种操作吗?是否有 technique/method/function 可以处理此问题?

注意:我之前尝试通过 polyfit 函数 "fit" 具有多项式的数据序列,然后通过 finverse 函数将其反转;但它会导致 f^-1 函数同时依赖于 xy。而且因为 x 甚至没有均匀间隔,我什至不知道如何绘制它...

反转由一系列 (x, y) 数据点表示的函数是通过更改 xy 的位置来完成的:(y, x)。这可以在 Matlab 中可视化如下:

figure
hold on
plot(x, y, 'red')
plot(y, x, 'blue')
from = min(min(x), min(y));
to = max(max(x), max(y));
plot([from to], [from to], 'k--')
legend('Original', 'Inverted')

由于函数的反函数只是函数关于轴 y=x 的反映,您可以通过变换来实现。

clear;close all

x=[0.0050879   0.0056528   0.0062176   0.0067822   0.0073467   0.0079111   0.0084752   0.0090392   0.0096030   0.0101666   0.0107299   0.0112930   0.0118558   0.0124184   0.0129807   0.0135428   0.0141045   0.0146659   0.0152270   0.0157877   0.0163481];
y=[0.0000e+00   0.0000e+00   0.0000e+00   0.0000e+00   0.0000e+00   0.0000e+00   0.0000e+00   0.0000e+00   0.0000e+00   0.0000e+00   4.4901e-05   4.4901e-05   8.9801e-05   1.3470e-04   1.7960e-04   2.2450e-04   2.6940e-04   3.5920e-04   4.0411e-04   4.9391e-04   5.8371e-04];
x_ori = x; y_ori = y;

figure; hold on;axis equal;grid on;axis tight;
plot(x,y);ls={'ori'};
plot(x,x,'-.');ls{end+1}='y=x';

%rotate x and y about z by -45 degree
rotz1=[cosd(45) sind(45) 0; -sind(45) cosd(45) 0; 0 0 1];
data = [x(:) y(:) ones(size(x(:)))]*rotz1;
x = data(:,1); y = data(:,2);
%plot(x,y,'--');ls{end+1}='rotated';

%flip x
x = -x;
%plot(x,y,'--');ls{end+1}='flipped';

%rotate x and y back
rotz2=[cosd(-45) sind(-45) 0; -sind(-45) cosd(-45) 0; 0 0 1];
data = [x(:) y(:) ones(size(x(:)))]*rotz2;
x = data(:,1); y = data(:,2);
plot(x,y);ls{end+1}='result';

%% Or a transformation matrix.
flipx = eye(3); flipx(1) = -1;
TM = rotz1*flipx*rotz2;

data = [x_ori(:) y_ori(:) ones(size(x(:)))]*TM;
x = data(:,1); y = data(:,2);
plot(x,y,'--');ls{end+1}='result by TM';
legend(ls);

更新

我很喜欢转换...然后我发现转换矩阵很简单

    | 0 1 0 |
T = | 1 0 0 |
    | 0 0 1 |

这基本上是交换 x 和 y....是的,这是函数反函数的基本内容。

很简单:

TM = [0,1,0;1,0,0;0,0,1];
data = [x_ori(:) y_ori(:) ones(size(x(:)))]*TM;
x = data(:,1); y = data(:,2);

是的,我的自尊受到了打击,@m7913d 的回答简单多了。