ysq231 ysq231
关注数: 7 粉丝数: 27 发帖数: 168 关注贴吧数: 8
克拉默求解n个未知数n个线性方程的代码 克拉默法则: 线性方程组的系数行列式不等于零,那么方程组即有唯一解。 (可以参考《线性代数》) Function klm(A() As Double, B() As Double) As Boolean Dim n As Integer Dim i As Integer, j As Integer, k As Integer Dim DetD As Double If UBound(A) = UBound(B) Then n = UBound(B) Else Exit Function End If ReDim mtxA(n, n) As Double ReDim mtxB(n) As Double For i = 1 To n For j = 1 To n mtxA(i, j) = A(i, j) Next Next DetD = MDetGauss(n, mtxA) If DetD = 0 Then klm = False Exit Function End If For k = 1 To n For i = 1 To n For j = 1 To n mtxA(i, j) = A(i, j) Next Next For i = 1 To n mtxA(i, k) = B(i) Next mtxB(k) = MDetGauss(n, mtxA) / DetD Next klm = True For i = 1 To n B(i) = mtxB(i) Next End Function N阶行列式(方阵)求行列式的值: Function MDetGauss(n As Integer, mtxA() As Double) As Double ' 局部变量 Dim i As Integer, j As Integer, k As Integer, nIs As Integer, nJs As Integer Dim f As Double, det As Double, q As Double, d As Double f = 1# det = 1# ' 选主元 For k = 1 To n - 1 q = 0# For i = k To n For j = k To n d = Abs(mtxA(i, j)) If (d > q) Then q = d nIs = i nJs = j End If Next j Next i ' 求解失败 If (q + 1# = 1#) Then MDetGauss = 0 Exit Function End If If (nIs <> k) Then f = -f For j = k To n d = mtxA(k, j) mtxA(k, j) = mtxA(nIs, j) mtxA(nIs, j) = d Next j End If ' 调整 If (nJs <> k) Then f = -f For i = k To n d = mtxA(i, nJs) mtxA(i, nJs) = mtxA(i, k) mtxA(i, k) = d Next i End If ' 计算行列式的值 det = det * mtxA(k, k) ' 调整方阵为上三角矩阵 For i = k + 1 To n d = mtxA(i, k) / mtxA(k, k) For j = k + 1 To n mtxA(i, j) = mtxA(i, j) - d * mtxA(k, j) Next j Next i Next k ' 计算行列式的值 det = f * det * mtxA(n, n) ' 求解成功 MDetGauss = det End Function 贴吧里做计算器 或者求表达式的挺多的。希望这个对你们有帮助。多研究下高级数学算法吧。
VB快速取色 Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long Private Type BITMAP bmType As Long '图像类型:0 表示是位图 bmWidth As Long '图像宽度(像素) bmHeight As Long '图像高度(像素) bmWidthBytes As Long '每一行图像的字节数 bmPlanes As Integer '图像的图层数 bmBitsPixel As Integer '图像的位数 bmBits As Long '位图的内存指针 End Type 调用了api效率比 GetPixel 快了一个数量级。 虽然在验证码识别时候,采用GetPixel足够了,进一步扩展到orc识别的话,就成了软肋。 所以选择了 GetBitmapBits。 主要代码: GetObject picShow.Image, Len(PicInfo), PicInfo BytesPerPixel = PicInfo.bmBitsPixel \ 8 ReDim PicBits(1 To PicInfo.bmWidth * PicInfo.bmHeight * BytesPerPixel) GetBitmapBits picShow.Image, UBound(PicBits), PicBits(1) ReDim Pica(1 To PicInfo.bmWidth, 1 To PicInfo.bmHeight) As Byte For Y = 1 To PicInfo.bmHeight For X = 1 To PicInfo.bmWidth i = (X - 1) * BytesPerPixel + (Y - 1) * PicInfo.bmWidthBytes B = PicBits(i + 1) G = PicBits(i + 2) R = PicBits(i + 3) Gray = R * 0.39 + G * 0.5 + B * 0.11 Pica(X, Y) = Gray Next Next 把picShow的图片的颜色取出并且灰度化了放在 Pica数组中,坐标和picturebox的初始坐标一致,原点为左上角。比起GetDIBits 从左下角为原点比较方便。 查阅了不少代码才总结出坐标转换:i = (X - 1) * BytesPerPixel + (Y - 1) * PicInfo.bmWidthBytes 。特发此帖,方便那些需要的人!
1 下一页