0003-如何查找01的位置

本文提供了一段Java代码示例,用于在整型数组中找到特定条件下非零元素的起始与结束位置。通过循环遍历数组,代码能够准确识别并记录这些位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



package test;

import java.util.ArrayList;

public class Test2 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // 定义一个数组
  int[] a = new int[] { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 };
  // 找到左数不是0的位置
  ArrayList ast = new ArrayList();
  for (int i = 0; i < a.length; i++) {
           int st1 = a[i];
           //如果数为0,同时左边为非0,或者此位置本深为开始位置时,记录
           if (st1==0 &&(i==0 || a[i-1]==1)){
            //记录开始位置
            ast.add(i);
           }
  }
  // 找到右边数不是0的位置
  ArrayList aed = new ArrayList();
  for (int i = 0; i < a.length; i++) {
          int ed1 = a[i];
          //如果数为0,同时右边为非0,或者此位置本深为结束位置时,记录
          if (ed1==0 &&(i==a.length-1 || a[i+1]==1)){
           //记录开始位置
           aed.add(i);
          }
  }
  
  //打印数组
  System.out.println("数组 :0, 0, 0, 0, 1, 0, 0, 0, 0, 0");
  //打印出 开始位置,结束位置
  String res = "";
  for (int j=0;j<aed.size();j++){
   res=res+" "+ "开始位置:"+ast.get(j)+"  结束位置 :"+aed.get(j);
  }
 }

}

内容概要:该PPT详细介绍了企业架构设计的方法论,涵盖业务架构、数据架构、应用架构和技术架构四大核心模块。首先分析了企业架构现状,包括业务、数据、应用和技术四大架构的内容和关系,明确了企业架构设计的重要性。接着,阐述了新版企业架构总体框架(CSG-EAF 2.0)的形成过程,强调其融合了传统架构设计(TOGAF)和领域驱动设计(DDD)的优势,以适应数字化转型需求。业务架构部分通过梳理企业级和专业级价值流,细化业务能力、流程和对象,确保业务战略的有效落地。数据架构部分则遵循五大原则,确保数据的准确、一致和高效使用。应用架构方面,提出了分层解耦和服务化的设计原则,以提高灵活性和响应速度。最后,技术架构部分围绕技术框架、组件、平台和部署节点进行了详细设计,确保技术架构的稳定性和扩展性。 适合人群:适用于具有一定企业架构设计经验的IT架构师、项目经理和业务分析师,特别是那些希望深入了解如何将企业架构设计与数字化转型相结合的专业人士。 使用场景及目标:①帮助企业和组织梳理业务流程,优化业务能力,实现战略目标;②指导数据管理和应用开发,确保数据的一致性和应用的高效性;③为技术选型和系统部署提供科学依据,确保技术架构的稳定性和扩展性。 阅读建议:此资源内容详尽,涵盖企业架构设计的各个方面。建议读者在学习过程中,结合实际案例进行理解和实践,重点关注各架构模块之间的关联和协同,以便更好地应用于实际工作中。
资 源 简 介 独立分量分析(Independent Component Analysis,简称ICA)是近二十年来逐渐发展起来的一种盲信号分离方法。它是一种统计方法,其目的是从由传感器收集到的混合信号中分离相互独立的源信号,使得这些分离出来的源信号之间尽可能独立。它在语音识别、电信和医学信号处理等信号处理方面有着广泛的应用,目前已成为盲信号处理,人工神经网络等研究领域中的一个研究热点。本文简要的阐述了ICA的发展、应用和现状,详细地论述了ICA的原理及实现过程,系统地介绍了目前几种主要ICA算法以及它们之间的内在联系, 详 情 说 明 独立分量分析(Independent Component Analysis,简称ICA)是近二十年来逐渐发展起来的一种盲信号分离方法。它是一种统计方法,其目的是从由传感器收集到的混合信号中分离相互独立的源信号,使得这些分离出来的源信号之间尽可能独立。它在语音识别、电信和医学信号处理等信号处理方面有着广泛的应用,目前已成为盲信号处理,人工神经网络等研究领域中的一个研究热点。 本文简要的阐述了ICA的发展、应用和现状,详细地论述了ICA的原理及实现过程,系统地介绍了目前几种主要ICA算法以及它们之间的内在联系,在此基础上重点分析了一种快速ICA实现算法一FastICA。物质的非线性荧光谱信号可以看成是由多个相互独立的源信号组合成的混合信号,而这些独立的源信号可以看成是光谱的特征信号。为了更好的了解光谱信号的特征,本文利用独立分量分析的思想和方法,提出了利用FastICA算法提取光谱信号的特征的方案,并进行了详细的仿真实验。 此外,我们还进行了进一步的研究,探索了其他可能的ICA应用领域,如音乐信号处理、图像处理以及金融数据分析等。通过在这些领域中的实验和应用,我们发现ICA在提取信号特征、降噪和信号分离等方面具有广泛的潜力和应用前景。
import time, os, gc, sys from media.sensor import * from media.display import * from media.media import * from machine import UART import time from machine import PWM, FPIOA #servo def find_majority_element(nums): """ 查找数组中出现次数超过一半的元素(众数) 参数: nums (list): 整数数组 返回: int or None: 众数(如果存在),否则返回None """ candidate = None # 候选众数 count = 0 # 计数器 # 第一轮遍历:找出候选众数 for num in nums: if count == 0: candidate = num # 当计数器为0时,更新候选众数 count += (1 if num == candidate else -1) # 相同则加1,不同则减1 # 验证候选众数是否确实超过半数 count = 0 for num in nums: if num == candidate: count += 1 # 如果出现次数超过数组长度的一半,则返回候选众数 return candidate if count > len(nums) // 2 else None #pid #class PID: # def __init__(self, kp, ki, input_value, target=320): # self.e = 0 # self.e_last = 0 # self.kp = kp # self.ki = ki # self.target = target # self.input_value = input_value # def cal(self, value): # self.e = self.target - value # delta = self.kp * (self.e-self.e_last) + self.ki * self.e # self.e_last = self.e # self.input_value = self.input_value + delta # return self.input_value class PID: def __init__(self, kp, ki, kd, maxI, maxOut): #静态参数 self.kp = kp self.ki = ki self.kd = kd #动态参数 self.change_p = 0 self.change_i = 0 self.change_d = 0 self.max_change_i = maxI #积分限幅 self.maxOutput = maxOut #输出限幅 self.error_sum = 0 #当前误差 self.last_error = 0 #之前误差 def change_zero(self):#PID变化累计的参数清零 self.change_p = 0 self.change_i = 0 self.change_d = 0 def pid_calc(self, reference, feedback):#reference=目标位置 feedback=当前位置 self.last_error = self.error_sum self.error_sum = reference - feedback #获取新的误差 #计算微分 dout = (self.error_sum - self.last_error) * self.kd #计算比例 pout = self.error_sum * self.kp #计算积分 self.change_i += self.error_sum * self.ki #积分限幅 if self.change_i > self.max_change_i : self.change_i = self.max_change_i elif self.change_i < -self.max_change_i: self.change_i = -self.max_change_i #计算输出 self.output = pout + dout + self.change_i #输出限幅 if self.output > self.maxOutput: self.output = self.maxOutput elif self.output < -self.maxOutput: self.output = -self.maxOutput return self.output #c_x=160 #c_y=120 #pid_x = PID(-0.002, -0.0003, 1.5/20*100, c_x) # # 垂直控制PID: 比例系数-0.002, 积分系数-0.0003, 初始控制值1.5ms #pid_y = PID(0.002, 0.0003, 1.5/20*100, c_y) pid_x=PID(-0.002, -0.0003,-0.0001,12.5,12.5) pid_y=PID(-0.002, -0.0003,-0.0001,12.5,12.5) #image DETECT_WIDTH = ALIGN_UP(320, 16) DETECT_HEIGHT = 240 sensor = None color_threshold =(71, 100, -15, 15, -34, -3) #color_threshold =((97, 100, -14, -4, -45, -2)) def camera_init(): global sensor # construct a Sensor object with default configure sensor = Sensor(width=DETECT_WIDTH,height=DETECT_HEIGHT) # sensor reset sensor.reset() # set hmirror # sensor.set_hmirror(False) # sensor vflip # sensor.set_vflip(False) # set chn0 output size sensor.set_framesize(width=DETECT_WIDTH,height=DETECT_HEIGHT) # set chn0 output format sensor.set_pixformat(Sensor.RGB565) # use IDE as display output Display.init(Display.VIRT, width= DETECT_WIDTH, height = DETECT_HEIGHT,fps=100,to_ide = True) # init media manager MediaManager.init() # sensor start run sensor.run() #######################image_function def camera_deinit(): global sensor # sensor stop run sensor.stop() # deinit display Display.deinit() # sleep os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) time.sleep_ms(100) # release media buffer MediaManager.deinit() def find_min_b(blobs): min_size=1000000 for blob in blobs: if min_size > blob[2]*blob[3] : min_blob=blob min_size = blob[2]*blob[3] return min_blob def find_max_c(circles): max_size=0 for circle in circles: if circle[3] > max_size: max_circle=circle max_size = circle[3] return max_circle def find_max_r(rects): max_size=0 for rect in rects: if rect[2]*rect[3] > max_size: max_rect=rect max_size = rect[2]*rect[3] return max_rect #############################servo_function #def pwm_init(): pwm_io1 = FPIOA() pwm_io1.set_function(47, FPIOA.PWM3) pwm_shang = PWM(3, 50, 50, enable=True) # 配置PWM3,默认频率50Hz,占空比50%,xia # 配置排针引脚号32,芯片引脚号为46的排针复用为PWM通道2输出 pwm_io2 = FPIOA() pwm_io2.set_function(46, FPIOA.PWM2) pwm_xia = PWM(2, 50, 50, enable=True) # 配置PWM2,默认频率50Hz,占空比50%,shang pwm_xia.duty(7.5) #xia舵机旋转到中间 pwm_shang.duty(7.5) #shang舵机旋转到中间 def capture_picture(): os.exitpoint() global sensor img = sensor.snapshot() # `threshold` below should be set to a high enough value to filter out noise # rectangles detected in the image which have low edge magnitudes. Rectangles # have larger edge magnitudes the larger and more contrasty they are... for c in img.find_circles(threshold = 10000): #img.draw_circle([v for v in r.circle()], color = (255, 0, 0)) img.draw_circle(c.x(), c.y(), c.r(), color=(255,0,0)) #for p in r.corners(): img.draw_circle(p[0], p[1], 5, color = (0, 255, 0)) img.draw_cross(c.x(), c.y(),color = (255, 0, 0)) print(c) #for r in img.find_rects(threshold = 10000): # img.draw_rectangle([v for v in r.rect()], color = (255, 255, 255)) # #for p in r.corners(): img.draw_circle(p[0], p[1], 5, color = (0, 255, 0)) # print(r) #img_rect = img.to_grayscale(copy=True) #img_rect = img_rect.binary([(23, 62)]) #rects=img_rect.find_rects(threshold =2000) blobs=None global flag #global max_blob global max_rect_ #max_blob=None #max_rect_=None #if rects: # max_rect_= find_max_r(rects) # img.draw_rectangle([v for v in max_rect_.rect()], color = (255, 255, 255)) # blobs = img.find_blobs([color_threshold],roi=max_rect_.rect(),merge=True,pixels_threshold=2,area_threshold=2) for i in range(6): img_rect = img.to_grayscale(copy=True) img_rect = img_rect.binary([(23, 62)]) rects = img_rect.find_rects(threshold=10000) # 最小面积阈值10000像 # 绘制找到的矩形 if not rects == None: for rect in rects: corner = rect.corners() # 获取矩形四个角点 # 绘制矩形边界 img.draw_line(corner[0][0], corner[0][1], corner[1][0], corner[1][1], color=(0, 255, 0), thickness=1) img.draw_line(corner[2][0], corner[2][1], corner[1][0], corner[1][1], color=(0, 255, 0), thickness=1) img.draw_line(corner[2][0], corner[2][1], corner[3][0], corner[3][1], color=(0, 255, 0), thickness=1) img.draw_line(corner[0][0], corner[0][1], corner[3][0], corner[3][1], color=(0, 255, 0), thickness=1) # 计算矩形中心点 c_x_target = sum([corner[k][0] for k in range(4)])/4 c_y_target = sum([corner[k][1] for k in range(4)])/4 if len(rects) == 2: print("center_point: {}".format([round(c_x), round(c_y)])) flag = 1 # 进入追踪模式 #pid_x.target = c_x #pid_y.target = c_y max_rect_= find_max_r(rects) t=0 t=t+1 blobs = img.find_blobs([color_threshold],roi=max_rect_.rect(),merge=True,pixels_threshold=2,area_threshold=2) #else flag=0 if blobs: max_blob = find_min_b(blobs)#调用函数,返回最大色块 #img.draw_circle(80,60,5,color=200) img.draw_circle(max_blob.cx(),max_blob.cy(),10,color=200) img.draw_rectangle((max_blob.x(),max_blob.y(),max_blob.w(),max_blob.h()),color=(255,0,0))#用红色框出最大色块 img.draw_string(0,0, "(x,y) =") img.draw_string(max_blob.x()+40,max_blob.y(), str(max_blob.cx())) img.draw_string(max_blob.x()+60,max_blob.y(), str(max_blob.cy()))#在框图显示色块的中心坐标 img.draw_string(40,0, str(max_blob.cx())) img.draw_string(60,0, str(max_blob.cy()))#在框图左上角显示色块的中心坐标 c_x = max_blob.x() + max_blob.w() / 2 c_y = max_blob.y() + max_blob.h() / 2 new_duty = pid_x.calc(c_x_target,c_x) # 计算新占空比 # 限制占空比在0.5ms-2.5ms范围内(舵机安全范围) new_duty = max(min(new_duty, 2.5/20*100), 0.5/20*100) # 更新水平舵机位置 #pwm_xia.enable(0) # 临时禁用PWM pwm_xia.duty(round(new_duty, 2)) # 设置新占空比 #pwm_xia.enable(1) # 重新启用PWM # 垂直方向PID控制 new_duty = pid_y.calc(c_y_target,c_y) # 计算新占空比 # 限制占空比在安全范围内 new_duty = max(min(new_duty, 2.5/20*100), 0.5/20*100) # 更新垂直舵机位置 #pwm_shang.enable(0) # 临时禁用PWM pwm_shang.duty(round(new_duty, 2)) # 设置新占空比 print(round(new_duty, 1)) # 调试输出 #pwm_shang.enable(1) # 重新启用PWM # draw result to screen Display.show_image(img) img = None gc.collect() def main(): os.exitpoint(os.EXITPOINT_ENABLE) camera_is_init = False fps = time.clock() #pwm_init() try: print("camera init") camera_init() camera_is_init = True print("camera capture") while True: fps.tick() try: capture_picture() except KeyboardInterrupt as e: print("user stop: ", e) break except BaseException as e: print(f"Exception {e}") break print(fps.fps()) except Exception as e: print(f"Exception {e}") finally: if camera_is_init: print("camera deinit") camera_deinit() if __name__ == "__main__": main()这段代码报错Exception local variable referenced before assignment
08-01
<think>我们正在处理一个Python错误:UnboundLocalError: local variable 'c_x' referenced before assignment 这个错误通常发生在函数内部,当我们尝试使用一个局部变量(在函数内部定义)时,在给它赋值之前就引用了它。 在图像处理代码中,可能是在某些条件分支中,变量没有被赋值,但在后续代码中被使用。 解决思路: 1. 检查变量`c_x`在函数中的定义位置。 2. 确保在所有可能的分支中(例如if-else的所有分支)都对该变量进行了赋值。 3. 或者,如果变量在函数外部定义,而我们想在函数内部修改它,需要使用`global`关键字声明(但通常不推荐,因为全局变量容易引起混乱)。 4. 另一种情况是,我们可能想使用外部变量,但又不希望它是全局的,那么可以考虑通过参数传递和返回值来获取。 在图像处理代码中,可能是由于某些条件(如图像中未检测到目标)导致`c_x`没有被赋值,而后续代码又试图使用它。 示例代码可能如下: ```python def process_image(): # ... 一些处理 if condition: c_x = 10 # 在这里赋值 # 后续使用c_x print(c_x) # 如果condition为False,那么c_x就没有被定义,这里就会报错 ``` 解决方法: 1. 在函数开头给`c_x`一个初始值(例如None),然后在条件分支中修改它。这样确保变量总是被定义。 2. 检查条件分支,确保所有路径都赋值。 修改后的代码: ```python def process_image(): c_x = None # 初始化为None if condition: c_x = 10 # 然后在使用前检查 if c_x is not None: print(c_x) else: print("c_x was not set") ``` 或者,如果条件分支中必须赋值,那么确保每个分支都赋值: ```python def process_image(): if condition: c_x = 10 else: c_x = 0 # 或者其他合适的默认值 print(c_x) ``` 根据引用[1]中的错误(虽然不完全相同,但都是关于变量作用域的问题),我们可以推断在函数内部,Python将`c_x`视为局部变量,而在使用前没有赋值。 在图像处理代码中,常见的场景可能是: - 我们试图在检测到某个特征点或区域后计算中心点坐标(c_x, c_y),但如果没有检测到,那么这些变量就没有被赋值。 - 因此,在检测代码之后使用这些变量就会导致错误。 所以,我们需要确保即使没有检测到,变量也有一个安全的值(或者处理没有检测到的情况,避免使用未赋值的变量)。 具体到你的代码,需要检查出现`c_x`的地方,特别是条件语句(如if)是否覆盖了所有可能的情况。 如果问题仍然存在,请提供相关代码片段,以便更准确地定位问题。 相关问题: 1. Python中局部变量和全局变量有什么区别? 2. 如何避免UnboundLocalError错误? 3. 在图像处理中,当检测失败时应该如何处理?</think>### Python UnboundLocalError: local variable 'c_x' referenced before assignment 解决方法 这个错误发生在函数内部尝试使用一个局部变量(`c_x`)时,该变量在**当前作用域内尚未被赋值**。在图像处理代码中,常见于以下场景: #### 🛠️ 错误原因分析 1. **分支条件未覆盖**:`c_x` 只在某些条件分支(如 `if` 块)中被赋值,但存在其他分支路径未赋值 ```python def process_image(): if condition: # 当condition=False时 c_x = 10 # 此赋值未执行 print(c_x) # 此处引用未赋值的变量 → 报错 ``` 2. **变量作用域混淆**:在函数内部修改外部变量但未声明 `global` 或 `nonlocal` ```python c_x = 0 # 全局变量 def process_image(): print(c_x) # 尝试读取全局变量 → 正常 c_x = 100 # 尝试修改 → 被解释为局部变量 → 冲突报错 ``` 3. **异步/延迟赋值**:在回调函数或循环中未正确初始化变量 ```python def on_detect(obj): if obj.found: c_x = obj.x # 可能未执行 # 后续使用c_x → 报错 ``` #### ✅ 解决方案 1. **初始化默认值**(推荐) 在函数开头初始化变量: ```python def process_image(): c_x = None # 或默认值0 if detection_success: c_x = calculate_center_x() # 使用时检查 if c_x is not None: draw_marker(c_x) ``` 2. **确保分支全覆盖** 为所有逻辑分支提供赋值: ```python def process_image(): if condition1: c_x = method1() elif condition2: c_x = method2() else: # 必须覆盖所有情况 c_x = default_value ``` 3. **明确作用域声明** 若需修改全局变量: ```python c_x = 0 # 全局变量 def process_image(): global c_x # 声明使用全局变量 c_x = new_value ``` 对于嵌套函数: ```python def outer(): c_x = 0 def inner(): nonlocal c_x # 声明使用外层变量 c_x += 1 ``` 4. **添加防御性检查** 在图像处理中,关键操作前验证变量: ```python if 'c_x' in locals() and c_x is not None: # 安全使用c_x else: print("坐标未初始化") ``` #### 🖼️ 图像处理场景示例 假设在目标检测代码中计算中心点: ```python def find_object_center(contours): c_x, c_y = None, None # 初始化 if len(contours) > 0: M = cv2.moments(contours[0]) if M["m00"] != 0: c_x = int(M["m10"] / M["m00"]) # 中心x坐标 c_y = int(M["m01"] / M["m00"]) # 安全使用 if c_x is not None: cv2.circle(image, (c_x, c_y), 5, (0,255,0), -1) else: print("警告:未检测到有效目标") return image ``` #### 📝 调试建议 1. 使用 `print(locals())` 查看作用域内变量 2. 在可能未赋值的分支添加日志: ```python else: print("分支未赋值c_x") # 帮助定位问题分支 ``` > **关键原则**:Python要求变量在**当前作用域内**必须**先赋值后引用**,这与C/Java等语言自动初始化默认值的行为不同[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值