首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >尝试在数组的特定行上输入数据

尝试在数组的特定行上输入数据
EN

Stack Overflow用户
提问于 2019-07-09 01:49:27
回答 2查看 65关注 0票数 0

我创建了一个500行10列的数组。我正在尝试使用雷达距离方程生成一个信号强度阵列。我想要在两个距离上检测两个目标,并将它们放入阵列中的特定点处。我有2个If语句嵌套在2个for循环中。虽然for循环工作正常,但我找不出If语句的错误所在。所有的值都是正确的(因此这些值的msgbox)

我尝试将信号(i,j) =0移动到If语句中,但我不确定如何设置界限,因为它位于除第50行和第250行之外的每个其他点。

Sub Generate_Power_Amplitude()
'/////////////////////Basic Parameters////////////////////////////
'/////////////////////Step 1//////////////////////////////////////
' Input the parameters of the Radar Range Equation
TotalPower = 10000 '(Watts)
Gain = 3162.27766 '(35 dB of gain)
Wavelength = 0.3 '(meters)
RCS = 15 '(meters^2)
RangeToTarget = 35000 '(meters)
PulseWidth = 1.67 * 10 ^ -6 '(seconds)
Bandwidth = 6 * 10 ^ 5 '(Hertz)
RangeBins = 1 * 10 ^ 3 '(meters)
PRI = 1 * 10 ^ -4 '(seconds)
PRF = 1 * 10 ^ 4 '(Hertz)
PRIDistance = 60000 '(meters)
'//////////////////Targets/////////////////////////////////////////////
'//////////////////Step 2//////////////////////////////////////////////
' Define how many targets and their distance
Target1 = 25000 '(meters)
Target2 = 125000 '(meters)
'/////////////////Operations//////////////////////////////////////////
RadarRangeNumerator = TotalPower * Gain ^ 2 * Wavelength ^ 2 * RCS
RadarRangeDenomenator = (4 * 3.1415926) ^ 3 * RangeToTarget ^ 4
RelativePower = RadarRangeNumerator / RadarRangeDenomenator
PowerAmplitude = RelativePower ^ 0.5
RelativePower1 = RadarRangeNumerator / ((4 * 3.1415926) ^ 3 * Target1 ^ 4)
RelativePower2 = RadarRangeNumerator / ((4 * 3.1415926) ^ 3 * Target2 ^ 4)
PowerAmp1 = RelativePower1 ^ 0.5
PowerAmp2 = RelativePower2 ^ 0.5

Dim Signal(500, 10)
For i = 1 To 500
    For j = 1 To 10
        If i = 50 Then
            Signal(50, j) = PowerAmp1
        ElseIf i = 250 Then
            Signal(250, j) = PowerAmp2
        End If
        Signal(i, j) = 0
    Next j
Next i
MsgBox Signal(50, 1)
MsgBox Signal(250, 1)
End Sub

我得到了msgboxes来给出正确的值,这是新的For循环,下面有一个评论,正如我所说的,我觉得这最终会被打破,如果有正确的方法,请让我知道。

Dim Signal(500, 10)
For i = 1 To 500
    For j = 1 To 10
        If i = 500 Then
            Signal(50, j) = PowerAmp1
            Signal(250, j) = PowerAmp2
        End If
        Signal(i, j) = 0
    Next j
Next i
EN

回答 2

Stack Overflow用户

发布于 2019-07-09 02:34:32

这可能是一个过于简单的答案,但似乎您只需要使用UboundLbound工具进行循环。以下是您的代码中的一个示例,您可以根据数组大小设置限制:

Dim Signal(500, 10)
For i = Lbound(Signal,1) To Ubound(Signal,1)
    For j = LBound(Signal,2) To UBound(Signal,2)
        If i = Ubound(Signal,1) Then
            'This part confuses me:
            Signal(50, j) = PowerAmp1
            Signal(250, j) = PowerAmp2
        End If
        Signal(i, j) = 0
    Next j
Next i
票数 0
EN

Stack Overflow用户

发布于 2019-07-09 02:57:55

如果您想要做的只是将50和250的值插入到数组中,那么您不需要将所有值都设置为零。在VBA中,包括数组元素在内的所有变量值都被初始化为零。因此这将产生与您的代码完全相同的结果:

Dim Signal(1 To 500, 1 To 10)
Signal(50, j) = PowerAmp1
Signal(250, j) = PowerAmp2

顺便说一句,注意我特别说明了数组的维数范围。VBA将默认使用从零开始的数组--这意味着您的定义从0 to 500生成了一个数组,即501个元素。

@PGSystemTester在将循环边界直接关联到数组边界方面是完全正确的。这是一种非常常见的做法,可以在以后省去很多心痛。

Dim Signal(1 To 500, 1 To 10)
For i = LBound(Signal, 1) To UBound(Signal, 1)
    For j = LBound(Signal, 2) To UBound(Signal, 2)
        If i = 500 Then
            Signal(50, j) = PowerAmp1
            Signal(250, j) = PowerAmp2
        End If
        Signal(i, j) = 0
    Next j
Next i

您的下一步可能是计算每个目标在一系列步进范围内的功率。请记住,要定义可变数量的步骤--在本例中是数组元素--您必须使用ReDim

Const RANGE_STEPS As Long = 1000
Dim Signal As Variant
ReDim Signal(1 To RANGE_STEPS, 1 To 10)

如果您使用的是UBound和LBound函数,那么您的循环将保持完全相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56940173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档