反转一系列数据,就像使用 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
函数同时依赖于 x
和 y
。而且因为 x
甚至没有均匀间隔,我什至不知道如何绘制它...
反转由一系列 (x, y)
数据点表示的函数是通过更改 x
和 y
的位置来完成的:(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 的回答简单多了。
是否可以"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
函数同时依赖于 x
和 y
。而且因为 x
甚至没有均匀间隔,我什至不知道如何绘制它...
反转由一系列 (x, y)
数据点表示的函数是通过更改 x
和 y
的位置来完成的:(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 的回答简单多了。