VB代码转成C或者C++,高人帮忙

rivershan 2005-07-06 11:54:08
这是一个模块中的代码
====================
Public datab() As Double '标准吸收数据
Public datay() As Double '样品吸收数据
Public ypshu As Double '样品数
Public zfshu As Integer '组分数
Public lengthsum As Integer '波长点数
Public r As Double '噪声方差
Public alpha As Integer '计算机精度常数
Public guesserr() As Double '估计误差的协方差矩阵
Public nongdu() As Double '浓度估计矩阵
Public king() As Double '增益矩阵
Public paiwei As Integer '第几个样品
Public q() As Double
Public hh() As Double

Public Sub kalman()
ReDim guesserr(0 To zfshu - 1, 0 To zfshu - 1) As Double
ReDim nongdu(0 To zfshu - 1) As Double
ReDim king(0 To zfshu - 1) As Double

For i0 = 0 To zfshu - 1
For i1 = 0 To zfshu - 1
guesserr(i0, i1) = 0
Next
nongdu(i0) = 0
guesserr(i0, i0) = (alpha * Sqr(r / (datab(1, i0) ^ 2))) ^ 2
Next i0

For i0 = 0 To lengthsum - 1

For i1 = 0 To zfshu - 1
king(i1) = 0
For i2 = 0 To zfshu - 1
king(i1) = datab(i0, i2) * guesserr(i1, i2) + king(i1)
Next
Next

z0 = 0
For i1 = 0 To zfshu - 1
z0 = z0 + king(i1) * datab(i0, i1)
Next
z0 = z0 + r

z1 = 0
For i1 = 0 To zfshu - 1
king(i1) = king(i1) / z0
z1 = z1 + datab(i0, i1) * nongdu(i1)
Next

z1 = datay(i0, paiwei) - z1

For i1 = 0 To zfshu - 1
nongdu(i1) = nongdu(i1) + king(i1) * z1
Next

ReDim q(0 To zfshu, 0 To zfshu)
For i1 = 0 To zfshu - 1
For i2 = 0 To zfshu - 1
q(i1, i2) = -king(i1) * datab(i0, i2)
Next
q(i1, i1) = 1 + q(i1, i1)
Next

ReDim hh(0 To zfshu - 1, 0 To zfshu - 1) As Double
For i1 = 0 To zfshu - 1
For i2 = 0 To zfshu - 1
hh(i1, i2) = 0
For i3 = 0 To zfshu - 1
hh(i1, i2) = q(i1, i3) * guesserr(i3, i2) + hh(i1, i2)
Next
Next
Next

For i1 = 0 To zfshu - 1
For i2 = 0 To zfshu - 1
guesserr(i1, i2) = 0
For i3 = 0 To zfshu - 1
guesserr(i1, i2) = guesserr(i1, i2) + hh(i1, i3) * q(i2, i3)
Next
guesserr(i1, i2) = guesserr(i1, i2) + r * king(i1) * king(i2)
Next
Next
For i = 0 To zfshu - 1
Debug.Print nongdu(i),
Next
Debug.Print
Next
End Sub
...全文
127 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
DooDu 2005-07-06
  • 打赏
  • 举报
回复
老大。。。你非得用这个代码呀。。
我给你的别的代码都不合适么?
这个变c也很简单的,注意数组是动态的,就是说在c里动态分配内存就可以了。
别的你还看不懂么。。
rivershan 2005-07-06
  • 打赏
  • 举报
回复
迷糊ing。。。
TechnoFantasy 2005-07-06
  • 打赏
  • 举报
回复
这个~~~~~ ,你找一个kalman算法的C代码不就行了。
ljhdi 2005-07-06
  • 打赏
  • 举报
回复
mark
Winters_lee 2005-07-06
  • 打赏
  • 举报
回复
3条星的老大,你这是在散分吗?呵呵,这也太简单了点吧?
calety1 2005-07-06
  • 打赏
  • 举报
回复
mark
crycoming 2005-07-06
  • 打赏
  • 举报
回复
mark
balloonman2002 2005-07-06
  • 打赏
  • 举报
回复
还有一个:

Sqr 函数

返回一个 Double,指定参数的平方根。

语法

Sqr(number)

必要的 number 参数 number 是 Double 或任何有效的大于或等于 0 的数值表达式。
balloonman2002 2005-07-06
  • 打赏
  • 举报
回复
整个程序除了redim()和Debug.Print 可能是VB特有的,其他应该都差不多吧,就是些循环操作

redim 表示重新定义数组元素个数的意思,主要是用于动态更改数组元素个数而已,如楼上所说,就是C里面的动态分配内存

Debug.Print 就是表示调试输出,相当于printf

附MSDN中说明:

**********************************************

动态数组


数组到底应该有多大才合适,有时可能不得而知。所以希望能够在运行时具有改变数组大小的能力。

动态数组就可以在任何时候改变大小。在 Visual Basic 中,动态数组最灵活、最方便,有助于有效管理内存。例如,可短时间使用一个大数组,然后,在不使用这个数组时,将内存空间释放给系统。

如果不用动态数组,就要声明一个数组,它的大小尽可能达到最大,然后再抹去那些不必要的元素。但是,如果过度使用这种方法,会导致内存的操作环境变慢。

要创建动态数组,请按照以下步骤执行:

(如果希望数组为公用数组,则)用 Public 语句声明数组,或者,(如果希望数组为模块级,则)在模块级用 Dim 语句声明数组,或者(如果希望数组为局部数组,则)在过程中用 Static 或 Dim 语句声明数组。给数组附以一个空维数表,这样就将数组声明为动态数组。
Dim DynArray ()

用 ReDim 语句分配实际的元素个数。
ReDim DynArray (X + 1)

ReDim 语句只能出现在过程中。与 Dim 语句、Static 语句不同,ReDim 语句是一个可执行语句,由于这一语句,应用程序在运行时执行一个操作。

ReDim 语句支持这样的语法,它与固定数组中使用的语法相同。对于每一维数,每个 ReDim 语句都能改变元素数目以及上下界。但是,数组的维数不能改变。

ReDim DynArray (4 to 12)

例如,用第一次声明在模块级所建立的动态数组 Matrix1:

Dim Matrix1 () As Integer

然后,在过程中给数组分配空间:

Sub CalcValuesNow ()
.
.
.
ReDim Matrix1 (19, 29)
End Sub

这里的 ReDim 语句给 Matrix 分配一个 20 × 30 的整数矩阵(元素总大小为 600)。还有一个办法,用变量设置动态数组的边界:

ReDim Matrix1 (X, Y)

注意 您可以将字符串赋值给大小可变的字节数组。一个字节数组也可以被赋值给一个可变长的字符串。一定要注意字符串中的字节数会随平台而变化。同一个字符串在 Unicode 平台上的字节数是它在非 Unicode 平台上的两倍。

保留动态数组的内容
每次执行 ReDim 语句时,当前存储在数组中的值都会全部丢失。Visual Basi 重新将数组元素的值置为 Empty(对 Variant 数组)、置为 0(对 Numeric 数组)、置为 零长度字符串(对 String 数组)或者置为 Nothing(对于对象的数组)。

在为新数据准备数组,或者要缩减数组大小以节省内存时,这样做是非常有用的。有时希望改变数组大小又不丢失数组中的数据。使用具有 Preserve 关键字的 ReDim 语句就可做到这点。例如,使用 UBound 函数引用上界,使数组扩大、增加一个元素,而现有元素的值并未丢失:

ReDim Preserve DynArray (UBound (DynArray) + 1)

在用 Preserve 关键字时,只能改变多维数组中最后一维的上界;如果改变了其它维或最后一维的下界,那么运行时就会出错。所以可这样编程:

ReDim Preserve Matrix (10, UBound (Matrix, 2) + 1)

而不可这样编程:

ReDim Preserve Matrix (UBound (Matrix, 1) + 1, 10)

详细信息 关于动态数组的更详细信息,请参阅语言参考中的“ReDim 函数”。关于对象数组,请参阅“用对象编程”。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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