VB.NET 对运算法支持的还是不够彻底

一个简单的例子:

None.gif Dim  pt  As   New  Point( 0 0 )
None.gifpt 
+=   New  Size( 10 10 )
None.gif

C# 中没有问题。在 VB.NET 中就不能编译,错误是
 
Operator '+' is not defined for types 'System.Drawing.Point' and 'System.Drawing.Size'.

其实看一下 Point 的il 代码,已经有了一个加法的重载

None.gif .method  public  hidebysig specialname  static  
None.gif        valuetype System.Drawing.Point  op_Addition(valuetype System.Drawing.Point pt,
None.gif                                                    valuetype System.Drawing.Size sz) cil managed
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
// Code size       36 (0x24)
InBlock.gif
  .maxstack  8
InBlock.gif  IL_0000:  ldarga.s   pt
InBlock.gif  IL_0002:  call       instance int32 System.Drawing.Point::get_X()
InBlock.gif  IL_0007:  ldarga.s   sz
InBlock.gif  IL_0009:  call       instance int32 System.Drawing.Size::get_Width()
InBlock.gif  IL_000e:  add
InBlock.gif  IL_000f:  ldarga.s   pt
InBlock.gif  IL_0011:  call       instance int32 System.Drawing.Point::get_Y()
InBlock.gif  IL_0016:  ldarga.s   sz
InBlock.gif  IL_0018:  call       instance int32 System.Drawing.Size::get_Height()
InBlock.gif  IL_001d:  add
InBlock.gif  IL_001e:  newobj     instance 
void System.Drawing.Point::.ctor(int32,
InBlock.gif                                                                 int32)
InBlock.gif  IL_0023:  ret
ExpandedBlockEnd.gif}
  //  end of method Point::op_Addition
None.gif


无奈只好改成:
None.gif          Dim  pt  As   New  Point( 0 0 )
None.gif        pt 
=  Point.op_Addition(pt,  New  Size( 10 10 ))
None.gif

查了一下,msdn mag 最新的一期提到了这个问题,其实原因很简单,vb.net 的compiler 还没有100% 对运算符重载支持的足够好。

原文地址:http://www.msdn.microsoft.com/msdnmag/issues/04/12/AdvancedBasics/default.aspx

转载于:https://www.cnblogs.com/montaque/archive/2004/11/29/70520.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Prony算法是一种用于信号分解和拟合的数学方法,它可以用来将一个复杂的信号分解为若干个简单的指数信号,并得到它们的振幅、频率和相位。 以下是使用VB.Net编写的基于Prony算法的源代码示例: ```vb Imports System Public Class PronyAlgorithm Public Shared Sub Main() ' 输入信号 Dim signal As Double() = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0} ' 设置参数 Dim numComponents As Integer = 2 ' 分解的指数信号数量 Dim numSamples As Integer = signal.Length ' 信号长度 ' 初始化变量 Dim amplitudes As Double() = New Double(numComponents - 1) {} Dim frequencies As Double() = New Double(numComponents - 1) {} Dim phases As Double() = New Double(numComponents - 1) {} ' 使用Prony算法进行分解 Dim matrixA As Double(,) = New Double(numSamples - numComponents - 1, numComponents - 1) {} Dim vectorB As Double() = New Double(numSamples - numComponents - 1) {} For i As Integer = 0 To numSamples - numComponents - 1 For j As Integer = 0 To numComponents - 1 matrixA(i, j) = signal(i + numComponents - j - 1) Next vectorB(i) = -signal(i + numComponents) Next Dim result() As Double Try result = MathNet.Numerics.LinearAlgebra.Matrix.Solve(MathNet.Numerics.LinearAlgebra.Matrix<double>.Build.DenseOfArray(matrixA), MathNet.Numerics.LinearAlgebra.Vector<double>.Build.Dense(vectorB)) Catch ex As MathNet.Numerics.NoConvergenceException Console.WriteLine("Prony算法无法收敛。") Return End Try For i As Integer = 0 To numComponents - 1 amplitudes(i) = result(i) frequencies(i) = Math.Log(result(i + numComponents) / result(i)) phases(i) = result(i + 2 * numComponents) Next ' 输出结果 For i As Integer = 0 To numComponents - 1 Console.WriteLine("第" & i + 1 & "个指数信号:") Console.WriteLine("振幅:" & amplitudes(i)) Console.WriteLine("频率:" & frequencies(i)) Console.WriteLine("相位:" & phases(i)) Next End Sub End Class ``` 此代码演示了如何使用Prony算法对给定的信号进行分解。你可以通过调整输入信号、分解的指数信号数量等参数来进行实验和测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值