我想找到一条线,该线具有围绕该线的多个点。线在2D空间中,由两个点或一个点和一个角度定义。它的算法是什么?
在SO和互联网以及数字接收中有很多关于此的内容,但所有示例似乎都集中在线的函数形式(y = ax + b),这对于(几乎)垂直不适用线。
我可能会检测到这条线是更水平还是更垂直,并且在另一种情况下交换坐标,但也许存在一些更优雅的解决方案?
我正在使用C#ATM,但可以从任何代码翻译。
答案 0 :(得分:2)
对不起,我不能提供参考,但这是如何:
假设你的N(2d)数据点是p [],你想找到一个矢量a和一个标量d来最小化
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<?php
include('header1.php');
?>
<!-- Javascript -->
</head>
<body >
<?php
include('sidenav.php');
?>
<div id="page-wrapper" >
<div id="page-inner">
<div class="row">
<div class="col-md-12">
<?php
if(isset($_GET['id']))
{
$id = $_GET['id'];
echo"<h2>Update Product</h2>";
}
else
{
echo"<h2>Add Product</h2>";
}
?>
</div>
</div>
<!-- /. ROW -->
<hr />
<div class="row">
<?php
include('config.php');
if(isset($_GET['id']))
{
$id = $_GET['id'];
if(isset($_POST['submit']))
{
echo "working";
$fileName=$_FILES["filepdf"]["name"];
$fileSize=$_FILES["filepdf"]["size"]/2024;
$fileType=$_FILES["filepdf"]["type"];
$fileTmpName=$_FILES["filepdf"]["tmp_name"];
if($fileType=="application/pdf")
{
if($fileSize<=200)
{
$random=rand(1111,9999);
$newFileName=$random.$fileName;
$uploadPath="testUpload/".$newFileName;
if(move_uploaded_file($fileTmpName,$uploadPath))
{
echo "Successful<BR>";
echo "File Name :".$newFileName."<BR>";
echo "File Size :".$fileSize." kb"."<BR>";
echo "File Type :".$fileType."<BR>";
}
else
{
echo "Maximum upload file size limit is 200 kb";
}
}
else
{
return false;
echo "You can only upload a pdf doc file.";
}
}
$cat=$_POST['catnm'];
$prodnm=$_POST['prodnm'];
$prod_dtl=$_POST['prod_dtl'];
$updates = $_POST['downld'] ? 'Yes' : 'No';
//$downld=$_POST['downld'];
$date=$_POST['date'];
$query3=mysql_query("update addproduct set catnm='$cat', prodnm='$prodnm',prod_dtl='$prod_dtl'
,pdf='$uploadPath',downld='$updates',date='$date' where id='$id'");
if($query3)
{
header('location:addProduct.php');
}
}
$query1=mysql_query("select * from addproduct where id='$id'");
$query4=mysql_fetch_array($query1);
//echo "<pre>";
//print_r($query4);
}
else
{
if(isset($_POST['submit']))
{
echo"Upload Only PDf File";
$fileName=$_FILES["filepdf"]["name"];
$fileSize=$_FILES["filepdf"]["size"]/2024;
$fileType=$_FILES["filepdf"]["type"];
$fileTmpName=$_FILES["filepdf"]["tmp_name"];
if($fileType=="application/pdf")
{
if($fileSize<=200){
//New file name
$random=rand(1111,9999);
$newFileName=$random.$fileName;
//File upload path
$uploadPath="testUpload/".$newFileName;
//function for upload file
if(move_uploaded_file($fileTmpName,$uploadPath))
{
echo "Successful<BR>";
echo "File Name :".$newFileName."<BR>";
echo "File Size :".$fileSize." kb"."<BR>";
echo "File Type :".$fileType."<BR>";
}
else
{
echo "Maximum upload file size limit is 200 kb";
}
}
else
{
return false;
echo "You can only upload a pdf file.";
}
echo "here downld";
$updates = isset($_POST['updates']) ? 'Yes' : 'No';
$catnm=$_POST['catnm'];
$prodnm=$_POST['prodnm'];
$prod_dtl=$_POST['prod_dtl'];
//$updates=$_POST['downld'];
$date=$_POST['date'];
$query=("insert into addproduct(catnm,prodnm,prod_dtl,pdf,downld,date)
values('$catnm','$prodnm','$prod_dtl','$uploadPath','$updates','$date')");
$result = mysql_query($query,$conn);
if($result)
{
header('location:addProduct.php');
}
}
}
}
?>
<div class="col-md-6 col-sm-12 col-xs-12">
<div class="panel-body">
<form method="post" enctype="multipart/form-data" name="myform" >
<br/>
<label>Select Category:</label>
<div class="form-group">
<?php
include('config.php');
$query1=mysql_query("select catnm from addcategory");
?>
<select class=form-control m-b-10 name=catnm id=catnm >
<?php
echo"<option>---Select---</option required>";
while($query=mysql_fetch_array($query1))
{
$selectedCat = '';
if($query[catnm] == $query4['catnm'])
{
$selectedCat = "selected";
}
echo "<option value='$query[catnm]' $selectedCat >$query[catnm]</option>";
}
?>
</select>
<br/>
<div class="form-group">
<input type="text" class="form-control" id="prodnm" placeholder="Product Name" name="prodnm" required value="<?php if(isset($query4['prodnm'])){
echo $query4['prodnm'];}?>"/>
</div>
<div class="form-group">
<textarea class="form-control" id="catdtl" name="prod_dtl" placeholder="Product Detail" "rows="10" cols="62" required><?php if(isset($query4['prod_dtl'])){echo $query4['prod_dtl'];} ?></textarea>
</div>
<div class="form-group">
<label for="exampleInputFile">PDF File</label>
<input type="file" id="exampleInputFile" accept="application/pdf" name="filepdf" >
file : <?php if(isset($query4['pdf'])){
echo $query4['pdf'];} ?>
</div>
<div class="checkbox">
<label>
<input id="checkbox" type="checkbox" name="updates"
<?php if(isset($query4['downld'])) { if($query4['downld'] == 'Yes') echo "checked='checked'"; echo $query4['downld'];}
?> /> Is Downloadable <br />
</label>
</div>
<input type="text" placeholder="Date of Upload" name="date" value="<?php
if(isset($query4['date'])){echo $query4['date'];}?>"id="datepicker-7">
<div style="padding-top:20px;padding-bottom:40px;width:650px;">
<input type="submit" name="submit" id="button" value="<?php
if(isset($_GET['id'])){$id = $_GET['id'];echo"Update";}else{echo"Submit";}?>"/>
<input type="button" value="cancel" onclick="window.location='index.php'"/>
<hr/>
</form>
</div>
<!-- /. ROW -->
</div>
<!-- /. PAGE INNER -->
</div>
<!-- /. PAGE WRAPPER -->
</div>
</body>
</html>
(该行是{q | a'* q = d} E是数据点距离该行的距离的平方和。)
一些乏味的代数表明
E = Sum{ i | sqr( a'*p[i] - d) }/N
其中M是平均值,C是数据的协方差,即
E = a'*C*a + sqr(d - a'*M)
通过选择d = a'* M来最小化E,并且a将成为对应于较小特征值的C的特征向量。
所以算法是:
计算M和C
找出C的较小特征值和相应的特征向量a
计算d = a'* M
(请注意,同样的东西也适用于更高的尺寸。例如在3d中我们会找到'最佳'平面)。