GVKun编程网logo

php – 在十进制列中查找MySQL中最接近的匹配项

5

在这篇文章中,我们将带领您了解php–在十进制列中查找MySQL中最接近的匹配项的全貌,同时,我们还将为您介绍有关android–玻璃语音命令从给定列表中最接近的匹配、C#–从十进制数组中查找最接近的

在这篇文章中,我们将带领您了解php – 在十进制列中查找MySQL中最接近的匹配项的全貌,同时,我们还将为您介绍有关android – 玻璃语音命令从给定列表中最接近的匹配、C# – 从十进制数组中查找最接近的索引、CSV:如何从列表(包含列表的列表)中找到最接近的匹配/最接近的值?、JavaScript 程序查找数组中最接近的数字的知识,以帮助您更好地理解这个主题。

本文目录一览:

php – 在十进制列中查找MySQL中最接近的匹配项

php – 在十进制列中查找MySQL中最接近的匹配项

下午,

我在解决这个问题时遇到了一些困难.我有一个MySQL表,其中列出了英国邮政编码及其经度和纬度值.我希望能够在桌面上进行搜索,找到与给定长/纬度对最接近的邮政编码.

我一直试图使用的查询是:

"SELECT id, outcode AS thecode, @la := MATCH(lat) AGAINST(?) AS score_lat, @ln := MATCH(lng) AGAINST(?) AS score_lng, @la + @ln AS score_total FROM postcodes ORDER BY score_total DESC LIMIT 10

然而,这只会返回看似随机的邮政编码,例如使用Lat:55.775549和Long:-4.047556

Array
(
[0] => Array
    (
        [id] => 929
        [thecode] => FK14
        [score_lat] => 0
        [score_lng] => 0
        [score_total] => 0
    )

[1] => Array
    (
        [id] => 2785
        [thecode] => UB3
        [score_lat] => 0
        [score_lng] => 0
        [score_total] => 0
    )

[2] => Array
    (
        [id] => 993
        [thecode] => G70
        [score_lat] => 0
        [score_lng] => 0
        [score_total] => 0
    )

[3] => Array
    (
        [id] => 2849
        [thecode] => WC2B
        [score_lat] => 0
        [score_lng] => 0
        [score_total] => 0
    )

[4] => Array
    (
        [id] => 1057
        [thecode] => GU29
        [score_lat] => 0
        [score_lng] => 0
        [score_total] => 0
    )

[5] => Array
    (
        [id] => 2913
        [thecode] => WS13
        [score_lat] => 0
        [score_lng] => 0
        [score_total] => 0
    )

[6] => Array
    (
        [id] => 1121
        [thecode] => HP20
        [score_lat] => 0
        [score_lng] => 0
        [score_total] => 0
    )

[7] => Array
    (
        [id] => 1185
        [thecode] => IG6
        [score_lat] => 0
        [score_lng] => 0
        [score_total] => 0
    )

[8] => Array
    (
        [id] => 1249
        [thecode] => IV25
        [score_lat] => 0
        [score_lng] => 0
        [score_total] => 0
    )

[9] => Array
    (
        [id] => 1313
        [thecode] => KA8
        [score_lat] => 0
        [score_lng] => 0
        [score_total] => 0
    )
)

数据库的架构是:

CREATE TABLE `postcodes` (
  `id` int(11) NOT NULL auto_increment,
  `outcode` varchar(4) NOT NULL,
  `lat` varchar(20) NOT NULL,
  `lng` varchar(20) NOT NULL,
  PRIMARY KEY  (`id`),
  FULLTEXT KEY `lat` (`lat`),
  FULLTEXT KEY `lng` (`lng`)
) ENGINE=MyISAM AUTO_INCREMENT=2975 DEFAULT CHARSET=latin1 AUTO_INCREMENT=2975 ;

我希望有人能帮帮忙!如果您需要更多信息,请询问……

谢谢,

tip2tail

解决方法:

MysqL match()函数用于全文搜索以匹配字符串. (所以它返回零值并不奇怪.)

如果“最接近”你的意思是你想要计算距离(如’乌鸦飞’那样测量),在地图上的两个点之间,坐标以(十进制度)纬度和经度给出,你真的需要使用大圆距离(GCD)计算.

http://en.wikipedia.org/wiki/Great-circle_distance

您可以跳过所有这些血腥的细节,只需使用我的实现.下面是我的一个sql语句的SELECT列表的摘录,这个表达式计算两点之间的距离(以英里为单位)……

     , ACOS(
          COS(radians( d2.latitude ))
        * COS(radians( d1.latitude ))
        * COS(radians( d2.longitude ) - radians( d1.longitude ))
        + SIN(radians( d2.latitude ))
        * SIN(radians( d1.latitude ))
           )*3958.82 AS distance_miles

在此示例中,d1表示原点,d2表示目标点.纬度和经度以DECIMAL值的形式提供.

对于d1有一个“已知”点,我可以通过这个表达式来排序,以便首先获得“最接近”的d2. (对于多个原点,我可以通过d1.id排序,然后通过这个表达式来获得每个d1最接近的d2.但足够我的问题…

我从您的问题中复制了查询并对其进行了修改(如下).基本上,我删除了“得分”列,并将其替换为进行距离计算的表达式:

SELECT id
     , outcode AS thecode
     , ACOS(
           COS(radians( d2.latitude ))
         * COS(radians( @d1_latitude ))
         * COS(radians( d2.longitude ) - radians( @d1_longitude ))
         + SIN(radians( d2.latitude ))
         * SIN(radians( @d1_latitude ))
           )*3958.82 AS distance_miles
  FROM postcodes d2
  JOIN (SELECT @d1_latitude := ?, @d1_longitude := ?) v
 ORDER BY distance_miles LIMIT 10

在这种情况下,@ d1_变量(从绑定变量分配)是“已知”点的纬度和经度.对于postcodes表中的每一行(为方便起见,我将其别名为d2),此表达式计算表中lat / long与“已知”点之间的距离.

注意:作为v别名的内联视图就在那里,因此您只需将纬度绑定一次,并将值分配给可以引用的用户变量.可以省略该内联视图,您可以看到将纬度绑定两次所需的位置.

注意:这以“英里”计算距离.您可以通过用不同的值代替3958.82常数来轻松获得以公里(km)为单位的距离.

注意:没有必要返回距离;你可以把这个表达式放在ORDER BY子句中,如果你只想按距离返回最近的10个,例如

SELECT id
     , outcode AS thecode
  FROM postcodes d2
  JOIN (SELECT @d1_latitude := ?, @d1_longitude := ?) v
 ORDER
    BY ACOS(
           COS(radians( d2.latitude ))
         * COS(radians( @d1_latitude ))
         * COS(radians( d2.longitude ) - radians( @d1_longitude ))
         + SIN(radians( d2.latitude ))
         * SIN(radians( @d1_latitude ))
           )*3958.82 AS distance_miles
 LIMIT 10

如果你正在寻找两点以外的距离,请告诉我,因为在这种情况下,这个答案对你没有任何帮助.

android – 玻璃语音命令从给定列表中最接近的匹配

android – 玻璃语音命令从给定列表中最接近的匹配

使用Glass,您可以通过“OK,Glass”菜单启动应用程序,似乎选择最近的匹配,除非命令为英里,您可以看到命令列表.
有没有从应用程序,或从语音提示(在最初的应用程序触发之后),给出一个类似的列表,并返回最近的匹配.

随机(非真实世界)的例子,一个显示颜色的应用程序,“OK Glass,显示颜色为红色”

“显示颜色”可能是您的声音触发器,似乎与“最近邻”方法中的玻璃相匹配,但是“红色”仅作为自由文本读取,可能容易被误认为“恐惧”或“头像”甚至“读”,因为没有区别“读”与“红”的方法.

有没有办法通过一个预先批准的选项(红,绿,蓝,橙*等)列表到这个阶段,或者在应用程序中的其他语音提示,以便用户可以看到列表并获得更准确的结果当有一组有限的预期响应(如主要的玻璃屏幕)时?

*好的,没有什么呵呵与橙色,我们可能是安全的那里

解决方法

Google GDK还不支持此功能.但是,某些库中已经有必要的功能,只要GDK本身不支持,就可以使用它们.
你要做什么:

拉玻璃GlassVoice.apk:adb pull /system/app/GlassVoice.apk
>使用dex2jar将此apk转换为jar文件.
>将jar文件添加到构建路径

现在你可以使用这个库:

public class VoiceActivity extends Activity {

    private VoiceInputHelper mVoiceInputHelper;
    private VoiceConfig mVoiceConfig;

        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.voice_activity);

        String[] items = {"red","green","blue","orange"};
        mVoiceConfig = new VoiceConfig("MyVoiceConfig",items);
        mVoiceInputHelper = new VoiceInputHelper(this,new MyVoiceListener(mVoiceConfig),VoiceInputHelper.newUserActivityObserver(this));
    }

    @Override
    protected void onResume() {
        super.onResume();
        mVoiceInputHelper.addVoiceServiceListener();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mVoiceInputHelper.removeVoiceServiceListener();
    }

    public class MyVoiceListener implements VoiceListener {
        protected final VoiceConfig voiceConfig;

        public MyVoiceListener(VoiceConfig voiceConfig) {
            this.voiceConfig = voiceConfig;
        }

        @Override
        public void onVoiceServiceConnected() {
            mVoiceInputHelper.setVoiceConfig(mVoiceConfig,false);
        }

        @Override
        public void onVoiceServicedisconnected() {

        }

        @Override
        public VoiceConfig onVoiceCommand(VoiceCommand vc) {
            String recognizedStr = vc.getLiteral();
            Log.i("VoiceActivity","Recognized text: "+recognizedStr);

            return voiceConfig;
        }

        @Override
        public FormattingLogger getLogger() {
            return FormattingLoggers.getContextLogger();
        }

        @Override
        public boolean isRunning() {
            return true;
        }

        @Override
        public boolean onResampledAudioData(byte[] arg0,int arg1,int arg2) {
            return false;
        }

        @Override
        public boolean onVoiceAmplitudeChanged(double arg0) {
            return false;
        }

        @Override
        public void onVoiceConfigChanged(VoiceConfig arg0,boolean arg1) {

        }
    }

}

C# – 从十进制数组中查找最接近的索引

C# – 从十进制数组中查找最接近的索引

decimal[] array = new decimal[5]{80.23,60.20,88.01,77.00,20.45};

decimal TargetNumber = 70.40;

这里,最近的值是77.00,如何找到最接近的十进制数组的索引?

注意:它应该保持与我需要的最接近值的精确索引相同的顺序.在这里,指数比价值重要

解决方法

关于使用LINQ做很多事情的一个好处是,如果找到完全匹配,你可以提前停止检查. minIndex保存索引,如果数组为空,则保持-1.
decimal mindistance = 0; //0 is fine here it is never read,it is just to make the compiler happy.
int minIndex = -1;

for(int i = 0; i < array.Length; i++)
{
    var distance = Math.Abs(TargetNumber - array[i]);
    if(minIndex == -1 || distance < mindistance)
    {
        mindistance = distance;
        minIndex = i;

        //Optional,stop testing if we find a exact match.
        if(mindistance == 0)
            break;
    }
}

为了好玩,我制作了一个完全通用的版本,它要求你传入一个委托来计算距离因子,它还有一个可选参数来定义停止检查更多结果所需的“最小距离”.

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        decimal[] array = new decimal[5]{80.23M,80.40M,80.80M,80.00M,20.45M};
        decimal TargetNumber = 70.40M;

        var result = FindClosestIndex(TargetNumber,array,(target,element) => Math.Abs(target - element)); //Optionally add in a "(distance) => distance == 0" at the end to enable early termination.

        Console.WriteLine(result);
    }

    public static int FindClosestIndex<T,U>(T target,IEnumerable<T> elements,Func<T,T,U> distanceCalculator,Func<U,bool> earlyTermination = null) where U : IComparable<U>
    {
        U mindistance = default(U);
        int minIndex = -1;

        using(var enumerator = elements.GetEnumerator())
        for(int i = 0; enumerator.MoveNext(); i++)
        {

            var distance = distanceCalculator(enumerator.Current,target);
            if(minIndex == -1 || mindistance.Compareto(distance) > 0)
            {
                mindistance = distance;
                minIndex = i;
            }

            if(earlyTermination != null && earlyTermination(mindistance))
                break;
        }

        return minIndex;
    }
}

Runnable example

CSV:如何从列表(包含列表的列表)中找到最接近的匹配/最接近的值?

CSV:如何从列表(包含列表的列表)中找到最接近的匹配/最接近的值?

如何解决CSV:如何从列表(包含列表的列表)中找到最接近的匹配/最接近的值??

我有一个代码可以读取包含 3 列的 CSV 文件中的一列:区域、网外呼叫和流量。

enter image description here

示例数据:

 Zone  Offnet calls  Traffic
zone0             0        0
zone1           421    30167
zone2           667    23172
zone3         12146   215033
zone4          7163   126514
zone5          5211   130045
zone6          1374    75357
zone7          3702   257846
zone8          1129    77677
zone9          2679    79331

我需要“网外通话”和“流量”来创建列表。例如,第 2 行将是 [421,30167] 并从包含相同参数列表的列表中搜索最佳匹配/最接近的值。 看代码会更清楚:


tp_usp15 = [10,200]
tp_usp23 = [15,250]
tp_usp27 = [20,300]
list_usp = [tp_usp15,tp_usp23,tp_usp27]

tp_bsnspls_s = [1,30]
tp_bsnspls_steel = [13,250]
tp_bsnspls_chrome = [18,350]
list_bsnspls = [tp_bsnspls_s,tp_bsnspls_steel,tp_bsnspls_chrome]

tp_bsnsrshn10 = [10,200]
tp_bsnsrshn15 = [15,300]
tp_bsnsrshn20 = [20,400]
list_bsnsrshn = [tp_bsnsrshn10,tp_bsnsrshn15,tp_bsnsrshn20]

common_list = list_usp + list_bsnspls + list_bsnsrshn

例如,从代码中提供的这个列表中,第 2 行 = [421,30167] 的最接近值/最佳匹配是 [20,400] = tp_bsnsrshn20。我需要一个代码来对 CSV 文件中的所有值进行相同的操作。最接近的值/最佳匹配需要记录到下一列(应在“流量”列旁边创建一个名为“最佳匹配”的新列)。我有一个适用于输入的代码。 2 个用户输入创建一个列表,搜索是从列表列表中完成的。

client_traffic = int(input("Enter the expected monthly traffic: "))
client_offnet = int(input("Enter monthly offnet calls: "))
list_client = [client_payment,client_offnet]

from functools import partial
def distance_squared(x,y):
    return (x[0] - y[0])**2 + (x[1] - y[1])**2
best_match_overall = min(common_list,key=partial(distance_squared,list_client))
name_best_match_overall = [k for k,v in locals().items() if v == best_match_overall][0]

如何将此代码应用于整个 CSV 文件。顺便说一下,它还给出了值的名称。我想高级用户应该不难创建一些循环,该循环将按照我在上一个代码中提供的相同概念但针对整个文件工作。在这一点上,我真的很挣扎。提前致谢,伙计们!

解决方法

输入数据:

>>> df
    Zone  Offnet calls  Traffic
0  zone0             0        0
1  zone1           421    30167
2  zone2           667    23172
3  zone3         12146   215033
4  zone4          7163   126514
5  zone5          5211   130045
6  zone6          1374    75357
7  zone7          3702   257846
8  zone8          1129    77677
9  zone9          2679    79331

将您的参考列表构建为数据框:

ref = {''tp_usp15'': [10,200],''tp_usp23'': [15,250],''tp_usp27'': [20,300],''tp_bsnspls_s'': [1,30],''tp_bsnspls_steel'': [13,''tp_bsnspls_chrome'': [18,350],''tp_bsnsrshn10'': [10,''tp_bsnsrshn15'': [15,''tp_bsnsrshn20'': [20,400]}

df1 = pd.DataFrame(ref,index=[''crit1'',''crit2'']).T.rename_axis(''Name'')
df1[''Best Match''] = list(map(list,df1.values))
>>> df1
                   crit1  crit2 Best Match
Name
tp_usp15              10    200  [10,200]
tp_usp23              15    250  [15,250]
tp_usp27              20    300  [20,300]
tp_bsnspls_s           1     30    [1,30]
tp_bsnspls_steel      13    250  [13,250]
tp_bsnspls_chrome     18    350  [18,350]
tp_bsnsrshn10         10    200  [10,200]
tp_bsnsrshn15         15    300  [15,300]
tp_bsnsrshn20         20    400  [20,400]

dfdf1 创建笛卡尔积并计算平方距离:

cx = pd.merge(df.reset_index(),df1.reset_index(),how=''cross'')
x0,x1,y0,y1 = cx[[''Offnet calls'',''Traffic'',''crit1'',''crit2'']].values.T
cx[''distance''] =  (x0 - y0)**2 + (x1 - y1)**2

保留每个 df 行的最接近值:

cols = [''index'',''Zone'',''Offnet calls'',''Best Match'',''Name'']
out = cx.loc[cx.groupby(''index'')[''distance''].idxmin(),cols] \
        .set_index(''index'').rename_axis(None)

输出结果:

>>> out
    Zone  Offnet calls  Traffic Best Match           Name
0  zone0             0        0    [1,30]   tp_bsnspls_s
1  zone1           421    30167  [20,400]  tp_bsnsrshn20
2  zone2           667    23172  [20,400]  tp_bsnsrshn20
3  zone3         12146   215033  [20,400]  tp_bsnsrshn20
4  zone4          7163   126514  [20,400]  tp_bsnsrshn20
5  zone5          5211   130045  [20,400]  tp_bsnsrshn20
6  zone6          1374    75357  [20,400]  tp_bsnsrshn20
7  zone7          3702   257846  [20,400]  tp_bsnsrshn20
8  zone8          1129    77677  [20,400]  tp_bsnsrshn20
9  zone9          2679    79331  [20,400]  tp_bsnsrshn20

JavaScript 程序查找数组中最接近的数字

JavaScript 程序查找数组中最接近的数字

javascript 程序查找数组中最接近的数字

我们将编写一个 JavaScript 程序,通过将每个元素与目标数字进行比较并跟踪最接近的元素来查找数组中最接近的数字。程序将使用循环遍历数组中的每个元素,并使用条件语句来比较目标数字与当前元素之间的差异。如果差值小于当前最接近的差值,我们将更新最接近的数字。该程序的结果将是给定数组中最接近目标的数字。

方法

该程序在数字数组中查找最接近目标值的数字 -

  • 定义一个变量来存储循环中目标值和当前值之间的差异。

  • 将差值设置为一个非常大的数字,这样数组中的任何数字都会变小并成为新的最接近的数字。

    立即学习“Java免费学习笔记(深入)”;

  • 循环遍历数字数组,对于每个数字,计算目标值与当前数字之间的绝对差。

  • 如果当前差值小于存储差值,则将存储差值更新为当前差值,并将当前数字存储为最接近的数字。

  • 对数组中的所有数字重复此过程。

  • 循环结束后,最接近目标值的数字就是变量中存储的数字。

示例

这是一个 JavaScript 函数的示例,它将数字数组和目标数字作为输入,并返回数组中与目标数字最接近的数字 -

function findClosest(numbers, target) {

   let closest = numbers[0]; 
   // Assume the first number is the closest
   let closestDiff = Math.abs(target - closest); 
   
   // Calculate the difference between the target and closest
   for (let i = 1; i < numbers.length; i++) {
      let current = numbers[i];
      let currentDiff = Math.abs(target - current); 
      
      // Calculate the difference between the target and current number
      if (currentDiff < closestDiff) {
         closest = current; 
         
         // Update the closest number
         closestDiff = currentDiff; 
         
         // Update the closest difference
      }
   }
   return closest;
}
const arr = [45, 23, 25, 78, 32, 56, 12];
const target = 50;

console.log(findClosest(arr, target));
登录后复制

说明

  • 函数findClosest有两个参数:一个数字数组和一个目标数字target。

  • 我们创建一个变量closest并将其设置为等于numbers数组中的第一个数字,并假设这是最接近目标的数字。

  • 我们还创建一个变量closestDiff,它使用Math.abs()计算目标数字和最接近数字之间的差异。 Math.abs()返回数字的绝对值,确保差值始终为正。

  • 然后我们使用 for 循环来迭代 numbers 数组。对于每次迭代,我们将当前数字存储在当前变量中,并在currentDiff中计算目标数字和当前数字之间的差异。

  • 如果currentDiff小于closestDiff,我们将closest更新为当前并且closestDiffcurrentDiff。

  • 最后,函数返回最接近目标的数字。

以上就是JavaScript 程序查找数组中最接近的数字的详细内容,更多请关注php中文网其它相关文章!

关于php – 在十进制列中查找MySQL中最接近的匹配项的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于android – 玻璃语音命令从给定列表中最接近的匹配、C# – 从十进制数组中查找最接近的索引、CSV:如何从列表(包含列表的列表)中找到最接近的匹配/最接近的值?、JavaScript 程序查找数组中最接近的数字的相关知识,请在本站寻找。

本文标签: