例如二维表格转换:y = f(x1,x2)=> x1 = f(y,x2)

时间:2019-05-08 14:07:41

标签: python algorithm matlab

我需要解决的问题是转换2D查找表。

enter image description here

此表可以定义为数组

Table = [ -54 97 ... 362;
          -60 114 ... 425;
          ...
          -111 31 ... 277;]

x1 = [0 20 ... 100]
x2 = [800 1200 ... 4800].

因此,鉴于排列中的任何x1x2,由上表定义的y = f(x1,x2)可以给出y的值。

现在,我需要根据x1y得到x2。也就是说,给定rpm和y值,找出合适的x1。例如800 rpm和97,则值为20%。如果它是800和107,则返回28.3%。

可以使用Matlab或Python。

3 个答案:

答案 0 :(得分:3)

在Matlab中:

我的另一个答案假设最普遍的情况是RPM的值可以是800到4800之间的任何值。但是,如果确定您选择的值将是行之一,则只需考虑该行中的值:

Percent = [0 20 30 40 ... 90 100];
RPM = [800; 1200; 1400; ... 4400; 4800];
Table = [ -54 97 ... 362;
          -60 114 ... 425;
          ...
          -111 31 ... 277;]
x2 = 800;
y = 107;

RPM_id = find(RPM == x2,1);
Table_row = Table(RPM_id,:);
x1 = interp1(Table_row,Percent,y)

再次导致

x1 =
   28.3333

答案 1 :(得分:2)

为避免插值的多重构造,我建议使用griddedInterpolant,以便所有插值都建立一次,然后您可以随意查询。

请注意,您应该考虑插值,即要用于计算不属于初始表的值(如OP中的(800; 107))的数值方案。基本(默认)方案是线性插值;对于您的表格(不是统一的),“ makima”和“ spline”中可能包含较高阶的插值方案。有关所有这些的更多信息,请参阅文档。

假设整个表都存储在变量T中,则用于构建插值的代码如下:

rpm = [800 1200 1400 1600:400:4800];
N = [0 20:10:100];
[g_rpm, g_N] = meshgrid(rpm, N);
G = griddedInterpolant(rpm, N ,T);

添加第四个参数以指定插值方案(例如'makima')。

然后,要找到所需的值,可以按如下所示构建自己的函数:

F = @(r, t) fminsearch(@(x) abs(t-G(r,x)), 50);

50是先验startint值;如果T不是montonic,则必须对其进行优化。

在OP中的输入上:

F(800, 97)给出20

F(800, 107)给出28.333(线性插值,makima插值28.224和样条插值26.898)

增强

如果要对计算进行向量化,可以通过用F将函数arrayfun的主体括起来来实现:

F = @(R,T) arrayfun(@(r,t) fminsearch(@(x) abs(t-G(r,x)), 25), R, T);

现在,您可以像这样一次输入几个输入:

F([800 2000],[100 100])

ans =

       21.966       15.564

答案 2 :(得分:1)

在Matlab中:

一般情况是x2值不是RPM向量的元素。如果可以肯定的话,您可以将下面的2D插值转换为1D插值。但是对于一般情况,您可以猜测x1,然后将(x1,x2)插值到表中,看看结果值是否等于y值。

"msg": [
    "10.172.240.4", 
    "10.172.0.6"
]

产生的结果

FROM ubuntu:bionic

# Install prerequisities for Ansible
RUN apt-get update
RUN apt-get -y install python3 python3-nacl python3-pip libffi-dev

# Install ansible
RUN pip3 install ansible

# Copy your ansible configuration into the image
COPY my_ansible_project /ansible

# Run ansible to configure things
RUN ansible-playbook /ansible/playbook.yml

编辑:此解决方案的先前版本基于百分比的均匀分布值。没有10%的列,因此示例的答案有误。解决方案已更新,以反映正确的百分比。