有人能把这个C程序翻译成VB么

ericwarner 2012-05-16 09:57:49
如题,因为VB我也就是看的懂一些什么仓库管理系统的设计代码,对于算法看的我有点晕
是要分析10个样本,每个样本有两个特征值,然后对10个样本进行谱系聚类分析

#include "stdafx.h"
#include<iostream>
#include<math.h>
using namespace std;
#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))

double T;//阈值
int size;
//样本结构体
struct sample{
int feature1,feature2;//分别是特征和特征
};
//欧氏距离
double Euclidean(sample a,sample b)
{
int minus[3];
double result;
minus[1] = a.feature1- b.feature1;
minus[2] = a.feature2 - b.feature2;
result = minus[1]*minus[1] + minus[2]*minus[2];
result = sqrt((double)result);
return result;

double nearestDistance(sample sam[],int a[],int b[])
{
int i,j;
bool haveCompared=false;
double min;
for(i=1;i<a[0]+1;i++)
{
for(j=1;j<b[0]+1;j++)
{
double temp=Euclidean(sam[a[i]],sam[b[j]]);
if(haveCompared==false)
{
min = temp;
}
else if(temp<min) min=temp;
}
}
return min;
}
//谱系聚类主要函数
void hierarchicalClustering(sample sam[])
{
int n=size-1;//类的个数
//group能够存放类的信息的二维数组,group[][0]为该类样本个数
int **group = new int*[size];
for(int i=0;i<size;i++)group[i]=new int[size];
group[0][0]=0;
for(int i=1;i<size;i++)//数组初始化,每个样本自成一类
{
group[0][i]=0;group[i][0]=1;group[i][1]=i;
}
//逐次聚类直到最终聚成两个类
for(int k=1;k<size-2;k++)
{
double distance;int count=0;
int N;//矩阵的长度
N=n*(n-1)/2;
//申明一个存放类间距离的矩阵
double *matrixD = new double[N+1];int **matrix = new int*[N+1];
for(int i=0;i<N+1;i++)matrix[i]=new int[2];
for(int i=1;i<size-1;i++)//将类间距离存入矩阵中
{
if(group[i][0]>0)
{
for(int j=i+1;j<size;j++)
{
if(group[j][0]>0)
{
distance = nearestDistance(sam,group[i],group[j]);
matrix[count][0]=i;matrix[count][1]=j;matrixD[count]=distance;
count++;
}
}
}
}
//找到最小距离的两个类
double minD;int minI=0,minJ=0;//I,J最小距离的两个类
count=0;
for(count=0;count<N;count++)
{
if(count==0)
{
minD=matrixD[count];
minI=matrix[count][0];minJ=matrix[count][1];
}
else if(minD>matrixD[count])
{
minD=matrixD[count];
minI=matrix[count][0];minJ=matrix[count][1];
}
}
//合并最小距离的两个类
for(int i=1;i<group[minJ][0]+1;i++)
{
group[minI][group[minI][0]+i]=group[minJ][i];
}
group[minI][0]+=group[minJ][0];
group[minJ][0]=0;
n--;
}
//输出谱系聚类算法结果
cout<<"谱系聚类算法的最终类结果是:"<<endl;
for(int i=1;i<size;i++)
{
if(group[i][0]>0)
{
cout<<"一类是:";
for(int j=1;j<group[i][0]+1;j++)
{
cout<<"样本"<<group[i][j]<<"("<<sam[group[i][j]].feature1<<
","<<sam[group[i][j]].feature2<<"); ";
}
cout<<endl;
}
}

因为我这个是基于EXCEL里的,也就是翻译出来放在excel的VB编辑器能用什么的,跪求~~
...全文
175 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoursatan 2012-06-02
  • 打赏
  • 举报
回复
这个工作量有点大啊,
东方之珠 2012-05-30
  • 打赏
  • 举报
回复
Function nearestDistance(sam() As sample, a() As Integer, b() As Integer) As Double

Dim i As Integer, j As Integer
Dim haveCompared As Boolean
haveCompared = False
Dim min As Double, temp As Double
i = 1
Do While i < a(0) + 1
j = 1
Do While j < b(0) + 1
temp = Euclidean(sam(a(i)), sam(b(j)))
If haveCompared = False Then
min = temp
ElseIf temp < min Then
min = temp
End If
End If
j = j + 1
Loop
i = i + 1
Loop
nearestDistance = min
End Function
东方之珠 2012-05-30
  • 打赏
  • 举报
回复
我来翻译第一个函数:
Dim T As Double '//阈值
Dim size As Integer

'//样本结构体
Type Sample
feature1 As Integer
feature2 As Integer '//分别是特征和特征
End Type

'//欧氏距离
Function Euclidean(a As Sample, b As Sample) As Double
Dim minus(3) As Integer
Dim result As Double
minus(1) = a.feature1 - b.feature1
minus(2) = a.feature2 - b.feature2
result = minus(1) * minus(1) + minus(2) * minus(2)
result = Sqr(CDbl(result))
Euclidean = result
End Function
熊孩子开学喽 2012-05-29
  • 打赏
  • 举报
回复
这样赤裸裸地找苦力可不好, 哪一句搞不懂问问还可以
junki 2012-05-16
  • 打赏
  • 举报
回复
这个工作量有点大啊,自己先去研究一下,不懂的地方再问吧

2,506

社区成员

发帖
与我相关
我的任务
社区描述
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。
社区管理员
  • VBA
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧