我需要解决的问题是转换2D查找表。
此表可以定义为数组
Table = [ -54 97 ... 362;
-60 114 ... 425;
...
-111 31 ... 277;]
x1 = [0 20 ... 100]
x2 = [800 1200 ... 4800].
因此,鉴于排列中的任何x1
,x2
,由上表定义的y = f(x1,x2)
可以给出y
的值。
现在,我需要根据x1
和y
得到x2
。也就是说,给定rpm和y
值,找出合适的x1
。例如800 rpm和97,则值为20%。如果它是800和107,则返回28.3%。
可以使用Matlab或Python。
答案 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%的列,因此示例的答案有误。解决方案已更新,以反映正确的百分比。