UILabel 的是非

转自 http://blog.sina.com.cn/s/blog_65de279801010m8h.html


//创建 UILabel
    UILabel*label1 = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 280,80)];

   //设置背景色
   label1.backgroundColor = [UIColor grayColor];

   //设置tag
    label1.tag =91;

   //设置标签文本
    label1.text= @"Hello world!";

   //设置标签文本字体和字体大小
    label1.font= [UIFont fontWithName:@"Arial" size:30];

   label1.font = [UIFont systemFontOfSize:15];

   //设置文本对其方式
   label1.textAlignment = UITextAlignmentCenter;


//设置文本显示多行

  label22.numberOfLines = 0;

   //文本对齐方式有以下三种
    //typedefenum {
   //   UITextAlignmentLeft = 0,左对齐
   //   UITextAlignmentCenter,居中对齐
   //   UITextAlignmentRight,右对齐                
    //}UITextAlignment;
   
    //文本颜色
   label1.textColor = [UIColor blueColor];
   
   //超出label边界文字的截取方式
   label1.lineBreakMode = UILineBreakModeTailTruncation;
   
   //截取方式有以下6种
    //typedefenum{      
   //   UILineBreakModeWordWrap =0,   以空格为边界,保留整个单词        
   //   UILineBreakModeCharacterWrap,  保留整个字符        
   //   UILineBreakModeClip,           到边界为止        
   //   UILineBreakModeHeadTruncation, 省略开始,以……代替      
   //   UILineBreakModeTailTruncation, 省略结尾,以……代替     
   //   UILineBreakModeMiddleTruncation,省略中间,以……代替,多行时作用于最后一行      
    //}UILineBreakMode;
   
   //文本文字自适应大小
   label1.adjustsFontSizeToFitWidth = YES;
   //当adjustsFontSizeToFitWidth=YES时候,如果文本font要缩小时
   //baselineAdjustment这个值控制文本的基线位置,只有文本行数为1是有效
   label1.baselineAdjustment = UIBaselineAdjustmentAlignCenters;
   
   //有三种方式
    //typedefenum {
   //   UIBaselineAdjustmentAlignBaselines = 0, 默认值文本最上端于label中线对齐
   //   UIBaselineAdjustmentAlignCenters,//文本中线于label中线对齐
   //   UIBaselineAdjustmentNone,//文本最低端与label中线对齐
    //}UIBaselineAdjustment;

   //文本最多行数,为0时没有最大行数限制
   label1.numberOfLines = 2;
   
   //最小字体,行数为1时有效,默认为0.0
   label1.minimumFontSize = 10.0;
   
    //文本高亮
   label1.highlighted = YES;
   
   //文本是否可变
   label1.enabled = YES;

   //去掉label背景色
   //label1.backgroundColor = [UIColor clearColor];

   //文本阴影颜色
   label1.shadowColor = [UIColor grayColor];

   //阴影大小
   label1.shadowOffset = CGSizeMake(1.0, 1.0);
   
   //是否能与用户交互
   label1.userInteractionEnabled = YES;
 
    [self.viewaddSubview:label1];


优化代码,在信号配置面板内加入优先级设置选项,其余代码不需要更改,给我优化后的完整的代码,代码:classdef TDMApp < matlab.apps.AppBase % Properties corresponding to app components properties (Access = public) UIFigure matlab.ui.Figure SignalConfigPanel matlab.ui.container.Panel NumSignalsEditField matlab.ui.control.NumericEditField NumSignalsLabel matlab.ui.control.Label SignalTypeDropDown matlab.ui.control.DropDown SignalTypeLabel matlab.ui.control.Label FrequencyEditField matlab.ui.control.NumericEditField FrequencyLabel matlab.ui.control.Label AddSignalButton matlab.ui.control.Button RemoveSignalButton matlab.ui.control.Button SignalsListBox matlab.ui.control.ListBox SignalsListLabel matlab.ui.control.Label StrategyPanel matlab.ui.container.Panel FixedRadioButton matlab.ui.control.RadioButton PriorityRadioButton matlab.ui.control.RadioButton StrategyButtonGroup matlab.ui.container.ButtonGroup TotalSlotsEditField matlab.ui.control.NumericEditField TotalSlotsLabel matlab.ui.control.Label SimulationPanel matlab.ui.container.Panel RunSimulationButton matlab.ui.control.Button RunFeedbackButton matlab.ui.control.Button RunAnalysisButton matlab.ui.control.Button ResultsTabGroup matlab.ui.container.TabGroup SignalsTab matlab.ui.container.Tab OriginalAxes matlab.ui.control.UIAxes TDMAxes matlab.ui.control.UIAxes DemuxAxes matlab.ui.control.UIAxes SyncedAxes matlab.ui.control.UIAxes PerformanceTab matlab.ui.container.Tab BERAxes matlab.ui.control.UIAxes ParametersTab matlab.ui.container.Tab ParametersTextArea matlab.ui.control.TextArea StatusLabel matlab.ui.control.Label ProgressBar matlab.ui.control.Lamp SNREditField matlab.ui.control.NumericEditField SNRLabel matlab.ui.control.Label IterationsEditField matlab.ui.control.NumericEditField IterationsLabel matlab.ui.control.Label DurationEditField matlab.ui.control.NumericEditField DurationLabel matlab.ui.control.Label SamplingRateEditField matlab.ui.control.NumericEditField SamplingRateLabel matlab.ui.control.Label end properties (Access = private) signals % 存储信号配置的cell数组 params % 系统参数结构体 tdmSystem % TDMSystem实例 controller % TDMFeedbackController实例 analyzer % TDMPerformanceAnalyzer实例 end methods (Access = private) function updateParams(app) % 更新系统参数 app.params = struct(); app.params.fs = app.SamplingRateEditField.Value; app.params.duration = app.DurationEditField.Value; app.params.numSignals = numel(app.signals); app.params.snrDb = app.SNREditField.Value; app.params.iterations = app.IterationsEditField.Value; app.params.totalSlots = app.TotalSlotsEditField.Value; % 设置时隙分配策略 if app.FixedRadioButton.Value app.params.strategy = 'fixed'; else app.params.strategy = 'priority'; end % 设置时钟漂移 app.params.clockDrift = zeros(1, app.params.numSignals); if app.params.numSignals > 0 app.params.clockDrift(1) = 0.001; end if app.params.numSignals > 1 app.params.clockDrift(2) = 0.002; end if app.params.numSignals > 2 app.params.clockDrift(3:end) = -0.001; end end function generateSignals(app) % 生成信号数据 t = 0:1/app.params.fs:app.params.duration-1/app.params.fs; app.tdmSystem.signals = zeros(app.params.numSignals, length(t)); app.tdmSystem.signalInfo = cell(app.params.numSignals, 1); for i = 1:app.params.numSignals sigConfig = app.signals{i}; switch sigConfig.type case '正弦波' freq = sigConfig.frequency; app.tdmSystem.signals(i, :) = sin(2*pi*freq*t); app.tdmSystem.signalInfo{i} = sprintf('正弦波 (%dHz)', freq); case '方波' freq = sigConfig.frequency; app.tdmSystem.signals(i, :) = square(2*pi*freq*t); app.tdmSystem.signalInfo{i} = sprintf('方波 (%dHz)', freq); case '随机噪声' app.tdmSystem.signals(i, :) = randn(1, length(t)); app.tdmSystem.signalInfo{i} = '随机噪声'; case '锯齿波' freq = sigConfig.frequency; app.tdmSystem.signals(i, :) = sawtooth(2*pi*freq*t); app.tdmSystem.signalInfo{i} = sprintf('锯齿波 (%dHz)', freq); case '脉冲信号' freq = sigConfig.frequency; duty = 0.3; % 占空比 app.tdmSystem.signals(i, :) = pulstran(t, 0:1/freq:app.params.duration, ... 'rectpuls', duty/freq); app.tdmSystem.signalInfo{i} = sprintf('脉冲信号 (%dHz)', freq); end end end function updateParametersDisplay(app) % 更新参数显示 paramText = sprintf('系统参数:\n'); paramText = [paramText sprintf('采样频率: %d Hz\n', app.params.fs)]; paramText = [paramText sprintf('信号持续时间: %.2f 秒\n', app.params.duration)]; paramText = [paramText sprintf('信号源数量: %d\n', app.params.numSignals)]; paramText = [paramText sprintf('信噪比: %d dB\n', app.params.snrDb)]; paramText = [paramText sprintf('时隙分配策略: %s\n', app.params.strategy)]; paramText = [paramText sprintf('总时隙数量: %d\n', app.params.totalSlots)]; paramText = [paramText sprintf('仿真迭代次数: %d\n', app.params.iterations)]; % 添加信号信息 paramText = [paramText sprintf('\n信号配置:\n')]; for i = 1:app.params.numSignals sig = app.signals{i}; paramText = [paramText sprintf('信号 %d: %s (频率: %d Hz)\n', i, sig.type, sig.frequency)]; end app.ParametersTextArea.Value = paramText; end function plotSignals(app) % 绘制原始信号 t = 0:1/app.params.fs:app.params.duration-1/app.params.fs; cla(app.OriginalAxes); hold(app.OriginalAxes, 'on'); colors = lines(app.params.numSignals); for i = 1:app.params.numSignals plot(app.OriginalAxes, t, app.tdmSystem.signals(i, :), ... 'Color', colors(i, :), 'DisplayName', app.tdmSystem.signalInfo{i}); end hold(app.OriginalAxes, 'off'); legend(app.OriginalAxes, 'Location', 'best'); title(app.OriginalAxes, '原始信号'); xlabel(app.OriginalAxes, '时间 (s)'); ylabel(app.OriginalAxes, '幅度'); grid(app.OriginalAxes, 'on'); % 绘制TDM信号 cla(app.TDMAxes); plot(app.TDMAxes, t, app.tdmSystem.tdmSignal); title(app.TDMAxes, ['TDM复用信号 (' app.params.strategy '策略)']); xlabel(app.TDMAxes, '时间 (s)'); ylabel(app.TDMAxes, '幅度'); grid(app.TDMAxes, 'on'); % 绘制解复用信号 cla(app.DemuxAxes); hold(app.DemuxAxes, 'on'); for i = 1:app.params.numSignals plot(app.DemuxAxes, t, app.tdmSystem.demuxSignals(i, :), ... 'Color', colors(i, :), 'DisplayName', ['信号 ' num2str(i)]); end hold(app.DemuxAxes, 'off'); legend(app.DemuxAxes, 'Location', 'best'); title(app.DemuxAxes, '解复用信号'); xlabel(app.DemuxAxes, '时间 (s)'); ylabel(app.DemuxAxes, '幅度'); grid(app.DemuxAxes, 'on'); % 绘制同步后信号 cla(app.SyncedAxes); hold(app.SyncedAxes, 'on'); for i = 1:app.params.numSignals plot(app.SyncedAxes, t, app.tdmSystem.syncedSignals(i, :), ... 'Color', colors(i, :), 'DisplayName', app.tdmSystem.signalInfo{i}); end hold(app.SyncedAxes, 'off'); legend(app.SyncedAxes, 'Location', 'best'); title(app.SyncedAxes, '同步后信号'); xlabel(app.SyncedAxes, '时间 (s)'); ylabel(app.SyncedAxes, '幅度'); grid(app.SyncedAxes, 'on'); % 绘制误码率 cla(app.BERAxes); bar(app.BERAxes, 1:app.params.numSignals, app.tdmSystem.ber, 0.6); title(app.BERAxes, '各信号的均方误差'); xlabel(app.BERAxes, '信号编号'); ylabel(app.BERAxes, '均方误差 (MSE)'); grid(app.BERAxes, 'on'); xticks(app.BERAxes, 1:app.params.numSignals); end end % Callbacks that handle component events methods (Access = private) % Code that executes after component creation function startupFcn(app) % 初始化参数 app.signals = {}; app.params = struct(); app.StatusLabel.Text = '准备就绪'; app.ProgressBar.Color = 'green'; % 设置默认参数 app.SamplingRateEditField.Value = 1000; app.DurationEditField.Value = 1; app.SNREditField.Value = 20; app.IterationsEditField.Value = 5; app.TotalSlotsEditField.Value = 50; app.NumSignalsEditField.Value = 0; app.PriorityRadioButton.Value = true; % 更新参数显示 updateParams(app); updateParametersDisplay(app); end % Button pushed function: AddSignalButton function AddSignalButtonPushed(app, ~) % 添加新信号 signalType = app.SignalTypeDropDown.Value; frequency = app.FrequencyEditField.Value; if frequency <= 0 uialert(app.UIFigure, '频率必须大于0', '无效参数'); return; end newSignal = struct(... 'type', signalType, ... 'frequency', frequency); app.signals{end+1} = newSignal; app.NumSignalsEditField.Value = numel(app.signals); % 更新信号列表 signalList = cell(1, numel(app.signals)); for i = 1:numel(app.signals) sig = app.signals{i}; signalList{i} = sprintf('信号 %d: %s (%d Hz)', i, sig.type, sig.frequency); end app.SignalsListBox.Items = signalList; % 更新参数 updateParams(app); updateParametersDisplay(app); app.StatusLabel.Text = sprintf('已添加信号: %s (%d Hz)', signalType, frequency); end % Button pushed function: RemoveSignalButton function RemoveSignalButtonPushed(app, ~) % 移除选中的信号 selectedIdx = app.SignalsListBox.Value; if isempty(selectedIdx) || selectedIdx > numel(app.signals) uialert(app.UIFigure, '请选择要删除的信号', '无选择'); return; end % 移除信号 removedSig = app.signals{selectedIdx}; app.signals(selectedIdx) = []; % 更新信号列表 app.NumSignalsEditField.Value = numel(app.signals); signalList = cell(1, numel(app.signals)); for i = 1:numel(app.signals) sig = app.signals{i}; signalList{i} = sprintf('信号 %d: %s (%d Hz)', i, sig.type, sig.frequency); end app.SignalsListBox.Items = signalList; % 如果没有信号,清除选择 if isempty(app.signals) app.SignalsListBox.Value = []; else app.SignalsListBox.Value = min(selectedIdx, numel(app.signals)); end % 更新参数 updateParams(app); updateParametersDisplay(app); app.StatusLabel.Text = sprintf('已移除信号: %s (%d Hz)', removedSig.type, removedSig.frequency); end % Value changed function: NumSignalsEditField function NumSignalsEditFieldValueChanged(app, ~) % 信号数量变化时更新 updateParams(app); updateParametersDisplay(app); end % Value changed function: SamplingRateEditField function SamplingRateEditFieldValueChanged(app, ~) updateParams(app); updateParametersDisplay(app); end % Value changed function: DurationEditField function DurationEditFieldValueChanged(app, ~) updateParams(app); updateParametersDisplay(app); end % Value changed function: SNREditField function SNREditFieldValueChanged(app, ~) updateParams(app); updateParametersDisplay(app); end % Value changed function: IterationsEditField function IterationsEditFieldValueChanged(app, ~) updateParams(app); updateParametersDisplay(app); end % Value changed function: TotalSlotsEditField function TotalSlotsEditFieldValueChanged(app, ~) updateParams(app); updateParametersDisplay(app); end % Selection changed function: StrategyButtonGroup function StrategyButtonGroupSelectionChanged(app, ~) updateParams(app); updateParametersDisplay(app); end % Button pushed function: RunSimulationButton function RunSimulationButtonPushed(app, ~) % 运行基础仿真 app.StatusLabel.Text = '运行基础仿真...'; app.ProgressBar.Color = 'yellow'; drawnow; try % 更新参数 updateParams(app); % 检查信号配置 if app.params.numSignals == 0 uialert(app.UIFigure, '请至少添加一个信号', '无信号'); app.ProgressBar.Color = 'red'; return; end % 创建TDM系统 app.tdmSystem = TDMSystem(app.params); % 生成信号 generateSignals(app); % 运行仿真 app.tdmSystem = app.tdmSystem.runSimulation(); % 显示结果 plotSignals(app); updateParametersDisplay(app); app.StatusLabel.Text = '基础仿真完成!'; app.ProgressBar.Color = 'green'; catch ME app.StatusLabel.Text = ['错误: ' ME.message]; app.ProgressBar.Color = 'red'; uialert(app.UIFigure, ME.message, '仿真错误'); end end % Button pushed function: RunFeedbackButton function RunFeedbackButtonPushed(app, ~) % 运行反馈控制仿真 app.StatusLabel.Text = '运行反馈控制仿真...'; app.ProgressBar.Color = 'yellow'; drawnow; try % 更新参数 updateParams(app); % 检查信号配置 if app.params.numSignals == 0 uialert(app.UIFigure, '请至少添加一个信号', '无信号'); app.ProgressBar.Color = 'red'; return; end % 创建反馈控制器 app.controller = TDMFeedbackController(app.params); % 生成信号 generateSignals(app); % 运行反馈仿真 app.controller = app.controller.runFeedbackSimulation(); % 显示结果(简化版) app.tdmSystem = app.controller; % 用于显示基本结果 plotSignals(app); updateParametersDisplay(app); app.StatusLabel.Text = '反馈控制仿真完成!'; app.ProgressBar.Color = 'green'; % 显示反馈控制结果 visualizeFeedbackResults(app.controller); catch ME app.StatusLabel.Text = ['错误: ' ME.message]; app.ProgressBar.Color = 'red'; uialert(app.UIFigure, ME.message, '仿真错误'); end end % Button pushed function: RunAnalysisButton function RunAnalysisButtonPushed(app, ~) % 运行性能分析 app.StatusLabel.Text = '运行性能分析...'; app.ProgressBar.Color = 'yellow'; drawnow; try % 更新参数 updateParams(app); % 检查信号配置 if app.params.numSignals == 0 uialert(app.UIFigure, '请至少添加一个信号', '无信号'); app.ProgressBar.Color = 'red'; return; end % 创建性能分析器 app.analyzer = TDMPerformanceAnalyzer(app.params); % 生成信号 generateSignals(app); % 运行性能分析 app.analyzer = app.analyzer.runPerformanceAnalysis(); % 显示结果(简化版) app.tdmSystem = app.analyzer; % 用于显示基本结果 plotSignals(app); updateParametersDisplay(app); app.StatusLabel.Text = '性能分析完成!'; app.ProgressBar.Color = 'green'; catch ME app.StatusLabel.Text = ['错误: ' ME.message]; app.ProgressBar.Color = 'red'; uialert(app.UIFigure, ME.message, '仿真错误'); end end end % App initialization and construction methods (Access = private) % Create UIFigure and components function createComponents(app) % Create UIFigure app.UIFigure = uifigure; app.UIFigure.Position = [100 100 1200 800]; app.UIFigure.Name = 'TDM通信系统仿真'; app.UIFigure.Scrollable = 'on'; % Create SignalConfigPanel app.SignalConfigPanel = uipanel(app.UIFigure); app.SignalConfigPanel.Title = '信号配置'; app.SignalConfigPanel.Position = [20 560 360 210]; % Create NumSignalsLabel app.NumSignalsLabel = uilabel(app.SignalConfigPanel); app.NumSignalsLabel.Position = [20 160 80 22]; app.NumSignalsLabel.Text = '信号数量:'; % Create NumSignalsEditField app.NumSignalsEditField = uieditfield(app.SignalConfigPanel, 'numeric'); app.NumSignalsEditField.Position = [110 160 60 22]; app.NumSignalsEditField.Value = 0; app.NumSignalsEditField.ValueChangedFcn = createCallbackFcn(app, @NumSignalsEditFieldValueChanged, true); % Create SignalTypeLabel app.SignalTypeLabel = uilabel(app.SignalConfigPanel); app.SignalTypeLabel.Position = [20 130 80 22]; app.SignalTypeLabel.Text = '信号类型:'; % Create SignalTypeDropDown app.SignalTypeDropDown = uidropdown(app.SignalConfigPanel); app.SignalTypeDropDown.Position = [110 130 100 22]; app.SignalTypeDropDown.Items = {'正弦波', '方波', '随机噪声', '锯齿波', '脉冲信号'}; % Create FrequencyLabel app.FrequencyLabel = uilabel(app.SignalConfigPanel); app.FrequencyLabel.Position = [20 100 80 22]; app.FrequencyLabel.Text = '频率 (Hz):'; % Create FrequencyEditField app.FrequencyEditField = uieditfield(app.SignalConfigPanel, 'numeric'); app.FrequencyEditField.Position = [110 100 60 22]; app.FrequencyEditField.Value = 50; % Create AddSignalButton app.AddSignalButton = uibutton(app.SignalConfigPanel, 'push'); app.AddSignalButton.ButtonPushedFcn = createCallbackFcn(app, @AddSignalButtonPushed, true); app.AddSignalButton.Position = [220 130 100 22]; app.AddSignalButton.Text = '添加信号'; % Create RemoveSignalButton app.RemoveSignalButton = uibutton(app.SignalConfigPanel, 'push'); app.RemoveSignalButton.ButtonPushedFcn = createCallbackFcn(app, @RemoveSignalButtonPushed, true); app.RemoveSignalButton.Position = [220 100 100 22]; app.RemoveSignalButton.Text = '移除信号'; % Create SignalsListLabel app.SignalsListLabel = uilabel(app.SignalConfigPanel); app.SignalsListLabel.Position = [20 70 80 22]; app.SignalsListLabel.Text = '信号列表:'; % Create SignalsListBox app.SignalsListBox = uilistbox(app.SignalConfigPanel); app.SignalsListBox.Position = [20 20 300 50]; app.SignalsListBox.Items = {}; % Create StrategyPanel app.StrategyPanel = uipanel(app.UIFigure); app.StrategyPanel.Title = '时隙分配策略'; app.StrategyPanel.Position = [400 560 250 210]; % Create StrategyButtonGroup app.StrategyButtonGroup = uibuttongroup(app.StrategyPanel); app.StrategyButtonGroup.SelectionChangedFcn = createCallbackFcn(app, @StrategyButtonGroupSelectionChanged, true); app.StrategyButtonGroup.Position = [20 100 200 80]; app.StrategyButtonGroup.Title = '选择策略'; % Create FixedRadioButton app.FixedRadioButton = uiradiobutton(app.StrategyButtonGroup); app.FixedRadioButton.Text = '固定分配'; app.FixedRadioButton.Position = [11 35 75 22]; % Create PriorityRadioButton app.PriorityRadioButton = uiradiobutton(app.StrategyButtonGroup); app.PriorityRadioButton.Text = '优先级分配'; app.PriorityRadioButton.Position = [11 10 100 22]; app.PriorityRadioButton.Value = true; % Create TotalSlotsLabel app.TotalSlotsLabel = uilabel(app.StrategyPanel); app.TotalSlotsLabel.Position = [20 60 80 22]; app.TotalSlotsLabel.Text = '总时隙数:'; % Create TotalSlotsEditField app.TotalSlotsEditField = uieditfield(app.StrategyPanel, 'numeric'); app.TotalSlotsEditField.ValueChangedFcn = createCallbackFcn(app, @TotalSlotsEditFieldValueChanged, true); app.TotalSlotsEditField.Position = [110 60 60 22]; app.TotalSlotsEditField.Value = 50; % Create SimulationPanel app.SimulationPanel = uipanel(app.UIFigure); app.SimulationPanel.Title = '仿真控制'; app.SimulationPanel.Position = [670 560 250 210]; % Create RunSimulationButton app.RunSimulationButton = uibutton(app.SimulationPanel, 'push'); app.RunSimulationButton.ButtonPushedFcn = createCallbackFcn(app, @RunSimulationButtonPushed, true); app.RunSimulationButton.Position = [30 150 190 30]; app.RunSimulationButton.Text = '运行系统仿真'; % Create RunFeedbackButton app.RunFeedbackButton = uibutton(app.SimulationPanel, 'push'); app.RunFeedbackButton.ButtonPushedFcn = createCallbackFcn(app, @RunFeedbackButtonPushed, true); app.RunFeedbackButton.Position = [30 100 190 30]; app.RunFeedbackButton.Text = '运行反馈控制'; % Create RunAnalysisButton app.RunAnalysisButton = uibutton(app.SimulationPanel, 'push'); app.RunAnalysisButton.ButtonPushedFcn = createCallbackFcn(app, @RunAnalysisButtonPushed, true); app.RunAnalysisButton.Position = [30 50 190 30]; app.RunAnalysisButton.Text = '运行性能分析'; % Create ResultsTabGroup app.ResultsTabGroup = uitabgroup(app.UIFigure); app.ResultsTabGroup.Position = [20 20 1150 520]; % Create SignalsTab app.SignalsTab = uitab(app.ResultsTabGroup); app.SignalsTab.Title = '信号可视化'; % Create OriginalAxes app.OriginalAxes = uiaxes(app.SignalsTab); title(app.OriginalAxes, '原始信号') xlabel(app.OriginalAxes, '时间 (s)') ylabel(app.OriginalAxes, '幅度') app.OriginalAxes.Position = [20 300 530 200]; % Create TDMAxes app.TDMAxes = uiaxes(app.SignalsTab); title(app.TDMAxes, 'TDM复用信号') xlabel(app.TDMAxes, '时间 (s)') ylabel(app.TDMAxes, '幅度') app.TDMAxes.Position = [20 50 530 200]; % Create DemuxAxes app.DemuxAxes = uiaxes(app.SignalsTab); title(app.DemuxAxes, '解复用信号') xlabel(app.DemuxAxes, '时间 (s)') ylabel(app.DemuxAxes, '幅度') app.DemuxAxes.Position = [580 300 530 200]; % Create SyncedAxes app.SyncedAxes = uiaxes(app.SignalsTab); title(app.SyncedAxes, '同步后信号') xlabel(app.SyncedAxes, '时间 (s)') ylabel(app.SyncedAxes, '幅度') app.SyncedAxes.Position = [580 50 530 200]; % Create PerformanceTab app.PerformanceTab = uitab(app.ResultsTabGroup); app.PerformanceTab.Title = '性能分析'; % Create BERAxes app.BERAxes = uiaxes(app.PerformanceTab); title(app.BERAxes, '均方误差 (MSE)') xlabel(app.BERAxes, '信号编号') ylabel(app.BERAxes, 'MSE') app.BERAxes.Position = [50 150 1000 300]; % Create ParametersTab app.ParametersTab = uitab(app.ResultsTabGroup); app.ParametersTab.Title = '系统参数'; % Create ParametersTextArea app.ParametersTextArea = uitextarea(app.ParametersTab); app.ParametersTextArea.Position = [20 50 1100 400]; app.ParametersTextArea.Value = {'系统参数将在此显示'}; % Create StatusLabel app.StatusLabel = uilabel(app.UIFigure); app.StatusLabel.HorizontalAlignment = 'right'; app.StatusLabel.Position = [100 800 800 22]; app.StatusLabel.Text = '准备就绪'; % Create ProgressBar app.ProgressBar = uilamp(app.UIFigure); app.ProgressBar.Position = [930 800 20 20]; app.ProgressBar.Color = [0.47 0.67 0.19]; % Create SNRLabel app.SNRLabel = uilabel(app.UIFigure); app.SNRLabel.Position = [950 750 80 22]; app.SNRLabel.Text = '信噪比 (dB):'; % Create SNREditField app.SNREditField = uieditfield(app.UIFigure, 'numeric'); app.SNREditField.ValueChangedFcn = createCallbackFcn(app, @SNREditFieldValueChanged, true); app.SNREditField.Position = [1040 750 60 22]; app.SNREditField.Value = 20; % Create IterationsLabel app.IterationsLabel = uilabel(app.UIFigure); app.IterationsLabel.Position = [950 710 80 22]; app.IterationsLabel.Text = '迭代次数:'; % Create IterationsEditField app.IterationsEditField = uieditfield(app.UIFigure, 'numeric'); app.IterationsEditField.ValueChangedFcn = createCallbackFcn(app, @IterationsEditFieldValueChanged, true); app.IterationsEditField.Position = [1040 710 60 22]; app.IterationsEditField.Value = 5; % Create DurationLabel app.DurationLabel = uilabel(app.UIFigure); app.DurationLabel.Position = [950 670 80 22]; app.DurationLabel.Text = '持续时间 (s):'; % Create DurationEditField app.DurationEditField = uieditfield(app.UIFigure, 'numeric'); app.DurationEditField.ValueChangedFcn = createCallbackFcn(app, @DurationEditFieldValueChanged, true); app.DurationEditField.Position = [1040 670 60 22]; app.DurationEditField.Value = 1; % Create SamplingRateLabel app.SamplingRateLabel = uilabel(app.UIFigure); app.SamplingRateLabel.Position = [950 630 80 22]; app.SamplingRateLabel.Text = '采样率 (Hz):'; % Create SamplingRateEditField app.SamplingRateEditField = uieditfield(app.UIFigure, 'numeric'); app.SamplingRateEditField.ValueChangedFcn = createCallbackFcn(app, @SamplingRateEditFieldValueChanged, true); app.SamplingRateEditField.Position = [1040 630 60 22]; app.SamplingRateEditField.Value = 1000; end end methods (Access = public) % Construct app function app = TDMApp % Create and configure components createComponents(app) % Register the app with App Designer registerApp(app, app.UIFigure) % Execute the startup function runStartupFcn(app, @startupFcn) if nargout == 0 clear app end end % Code that executes before app deletion function delete(app) % Delete UIFigure when app is deleted delete(app.UIFigure) end end end
06-26
function vehicle_ride_comfort_calculator % 创建主窗口 fig = uifigure('Name', '车辆平顺性计算器', 'Position', [100, 100, 1200, 650]); % 创建参数输入区域 createInputPanel(fig); % 创建按钮区域 buttonsPanel = uipanel(fig, 'Title', '操作', ... 'Position', [50, 20, 300, 90]); % 创建计算按钮 calcButton = uibutton(buttonsPanel, 'push', ... 'Text', '计算平顺性指标', ... 'Position', [20, 20, 120, 30], ... 'ButtonPushedFcn', @(btn,event) calculateRideComfort(fig)); % 创建重置按钮 resetButton = uibutton(buttonsPanel, 'push', ... 'Text', '重置参数', ... 'Position', [160, 20, 120, 30], ... 'ButtonPushedFcn', @(btn,event) resetParameters(fig)); % 创建结果显示区域 resultsPanel = uipanel(fig, 'Title', '计算结果', ... 'Position', [50, 120, 300, 130]); uilabel(resultsPanel, 'Text', '加权加速度均方根值 a_w:', ... 'Position', [10, 90, 180, 22]); resultLabel = uilabel(resultsPanel, 'Text', '等待计算...', ... 'Position', [190, 90, 100, 22]); uilabel(resultsPanel, 'Text', '平顺性评价:', ... 'Position', [10, 60, 100, 22]); evaluationLabel = uilabel(resultsPanel, 'Text', '等待计算...', ... 'Position', [100, 60, 190, 22]); % 创建评价标准说明 standardText = sprintf(['评价标准:\n'... 'a_w < 0.5 m/s²: 优秀\n'... '0.5 ≤ a_w < 1.0 m/s²: 良好\n'... '1.0 ≤ a_w < 1.5 m/s²: 一般\n'... 'a_w ≥ 1.5 m/s²: 较差']); uitextarea(resultsPanel, ... 'Position', [10, 10, 280, 40], ... 'Value', standardText, ... 'Editable', 'off'); % 创建图表区域 chartsPanel = uipanel(fig, 'Title', '分析图表', ... 'Position', [370, 20, 500, 600]); ax1 = uiaxes(chartsPanel, 'Position', [50, 320, 400, 230]); title(ax1, '频率响应函数 |H(f)|'); xlabel(ax1, '频率 (Hz)'); ylabel(ax1, '|H(f)|'); grid(ax1, 'on'); ax2 = uiaxes(chartsPanel, 'Position', [50, 50, 400, 230]); title(ax2, '加速度功率谱密度'); xlabel(ax2, '频率 (Hz)'); ylabel(ax2, 'G_{z_s}(f) (m^2/s^4/Hz)'); grid(ax2, 'on'); % 创建图表解释区域(位于图表右侧) explanationPanel = uipanel(fig, 'Title', '图表解释', ... 'Position', [880, 20, 300, 600]); explanationText = sprintf(['频率响应函数 |H(f)|\n'... '• 描述车辆系统对不同频率路面激励的响应特性\n'... '• 峰值位置对应系统的固有频率\n'... ' - 低频峰值(1-2Hz): 簧载质量(车身)共振\n'... ' - 高频峰值(10-15Hz): 非簧载质量(车轮)共振\n'... '• 峰值高度表示振动放大效应,越高平顺性越差\n'... '• 曲线形状反映系统阻尼特性\n\n'... '加速度功率谱密度\n'... '• 描述车身振动能量在频率域上的分布\n'... '• 峰值位置对应系统的共振频率\n'... '• 峰值高度表示该频率的振动能量大小\n'... '• 曲线下面积与加权加速度均方根值 a_w 的平方成正比\n'... '• 展示振动能量在不同频率区间的分布情况\n\n'... '两图表关系\n'... 'G(f) = |H(f)|² · G_q(f)\n'... '• G(f): 加速度功率谱密度\n'... '• |H(f)|: 频率响应函数\n'... '• G_q(f): 路面激励功率谱密度']); uitextarea(explanationPanel, ... 'Position', [10, 10, 280, 560], ... 'Value', explanationText, ... 'Editable', 'off'); % 存储GUI组件句柄 fig.UserData.msEdit = findobj(fig, 'Tag', 'msEdit'); fig.UserData.muEdit = findobj(fig, 'Tag', 'muEdit'); fig.UserData.ksEdit = findobj(fig, 'Tag', 'ksEdit'); fig.UserData.ktEdit = findobj(fig, 'Tag', 'ktEdit'); fig.UserData.csEdit = findobj(fig, 'Tag', 'csEdit'); fig.UserData.vEdit = findobj(fig, 'Tag', 'vEdit'); fig.UserData.roadDropDown = findobj(fig, 'Tag', 'roadDropDown'); fig.UserData.resultLabel = resultLabel; fig.UserData.evaluationLabel = evaluationLabel; fig.UserData.ax1 = ax1; fig.UserData.ax2 = ax2; % 存储默认值 fig.UserData.defaults.ms = 300; fig.UserData.defaults.mu = 40; fig.UserData.defaults.ks = 20000; fig.UserData.defaults.kt = 180000; fig.UserData.defaults.cs = 1500; fig.UserData.defaults.v = 72; fig.UserData.defaults.road = 'B级路面'; % 初始化参数 resetParameters(fig); end function createInputPanel(fig) % 创建输入面板 inputPanel = uipanel(fig, 'Title', '车辆参数和工况设置', ... 'Position', [50, 260, 300, 350]); % 创建输入字段 createInputField(inputPanel, 'msEdit', '簧载质量 (kg):', 20, 280, 250, 30, 22, '300'); createInputField(inputPanel, 'muEdit', '非簧载质量 (kg):', 20, 240, 250, 30, 22, '40'); createInputField(inputPanel, 'ksEdit', '悬架刚度 (N/m):', 20, 200, 250, 30, 22, '20000'); createInputField(inputPanel, 'ktEdit', '轮胎刚度 (N/m):', 20, 160, 250, 30, 22, '180000'); createInputField(inputPanel, 'csEdit', '阻尼系数 (N·s/m):', 20, 120, 250, 30, 22, '1500'); createInputField(inputPanel, 'vEdit', '车速 (km/h):', 20, 80, 250, 30, 22, '72'); % 创建路面等级选择下拉菜单 uilabel(inputPanel, 'Text', '路面等级:', 'Position', [20, 40, 100, 22]); roadDropDown = uidropdown(inputPanel, ... 'Items', {'B级路面', 'C级路面'}, ... 'Position', [120, 40, 150, 30], ... 'Value', 'B级路面', ... 'Tag', 'roadDropDown'); end function createInputField(parent, tag, labelText, x, y, width, height, labelHeight, defaultVal) uilabel(parent, 'Text', labelText, 'Position', [x, y, width, labelHeight]); uieditfield(parent, 'numeric', ... 'Tag', tag, ... 'Value', str2double(defaultVal), ... 'Position', [x+120, y, width-120, height]); end function resetParameters(fig) % 重置所有参数为默认值 fig.UserData.msEdit.Value = fig.UserData.defaults.ms; fig.UserData.muEdit.Value = fig.UserData.defaults.mu; fig.UserData.ksEdit.Value = fig.UserData.defaults.ks; fig.UserData.ktEdit.Value = fig.UserData.defaults.kt; fig.UserData.csEdit.Value = fig.UserData.defaults.cs; fig.UserData.vEdit.Value = fig.UserData.defaults.v; fig.UserData.roadDropDown.Value = fig.UserData.defaults.road; % 清空图表 cla(fig.UserData.ax1); cla(fig.UserData.ax2); % 重置结果显示 fig.UserData.resultLabel.Text = '等待计算...'; fig.UserData.evaluationLabel.Text = '等待计算...'; % 更新图表标题 title(fig.UserData.ax1, '频率响应函数 |H(f)|'); title(fig.UserData.ax2, '加速度功率谱密度'); msgbox('参数已重置为默认值!', '重置完成'); end function evaluation = getEvaluation(aw) % 根据加权加速度均方根值给出平顺性评价 if aw < 0.5 evaluation = '优秀'; elseif aw < 1.0 evaluation = '良好'; elseif aw < 1.5 evaluation = '一般'; else evaluation = '较差'; end end function calculateRideComfort(fig) % 获取用户输入 ms = fig.UserData.msEdit.Value; mu = fig.UserData.muEdit.Value; ks = fig.UserData.ksEdit.Value; kt = fig.UserData.ktEdit.Value; cs = fig.UserData.csEdit.Value; v_kmh = fig.UserData.vEdit.Value; % 获取车速,单位km/h v = v_kmh / 3.6; % 转换为m/s roadType = fig.UserData.roadDropDown.Value; % 设置路面参数 if strcmp(roadType, 'B级路面') Gq_n0 = 64e-6; % m^3 roadClass = 'B'; else Gq_n0 = 256e-6; % m^3 roadClass = 'C'; end n0 = 0.1; % m^(-1) % 计算路面速度功率谱密度 (常数) G_qdot = 4 * pi^2 * Gq_n0 * n0^2 * v; % 频率范围 f = logspace(-1, 2, 1000)'; % 0.1Hz到100Hz,对数间隔 w = 2 * pi * f; % 初始化频响函数 H = zeros(length(f), 1); % 计算每个频率点的频响函数 for i = 1:length(f) % 系统矩阵元素 a11 = -w(i)^2 * ms + 1j * w(i) * cs + ks; a12 = -1j * w(i) * cs - ks; a21 = a12; a22 = -w(i)^2 * mu + 1j * w(i) * cs + ks + kt; % 系统矩阵 A = [a11, a12; a21, a22]; % 力向量 F = [0; kt]; % 求解系统响应 Z = A \ F; % 计算加速度对路面速度的频响函数 H(i) = (-1j * w(i)) * Z(1); end % 计算加速度功率谱密度 G_zdd = abs(H).^2 * G_qdot; % 1/3倍频带中心频率 (Hz) fc = [1.0, 1.25, 1.6, 2.0, 2.5, 3.15, 4.0, 5.0, 6.3, 8.0, 10.0, ... 12.5, 16.0, 20.0, 25.0, 31.5, 40.0, 50.0, 63.0, 80.0]; % 1/3倍频带上下限频率 fl = fc / (2^(1/6)); fu = fc * (2^(1/6)); % 垂直振动加权系数 (从标准中获取) Wj = [0.50, 0.56, 0.63, 0.71, 0.80, 0.90, 1.00, 1.00, 1.00, 1.00, ... 0.80, 0.63, 0.50, 0.40, 0.315, 0.25, 0.20, 0.16, 0.125, 0.10]; % 计算每个1/3倍频带的均方根值 aj = zeros(length(fc), 1); for j = 1:length(fc) % 找到在当前频带内的频率点 idx = (f >= fl(j)) & (f <= fu(j)); if any(idx) % 使用梯形法数值积分计算频带内的功率 band_power = trapz(f(idx), G_zdd(idx)); aj(j) = sqrt(band_power); else aj(j) = 0; end end % 计算加权加速度均方根值 aw = sqrt(sum((Wj .* aj').^2)); % 获取平顺性评价 evaluation = getEvaluation(aw); % 更新结果显示 fig.UserData.resultLabel.Text = sprintf('%.3f m/s²', aw); fig.UserData.evaluationLabel.Text = evaluation; % 根据评价结果设置文本颜色 if aw < 0.5 fig.UserData.evaluationLabel.FontColor = [0, 0.5, 0]; % 深绿色表示优秀 elseif aw < 1.0 fig.UserData.evaluationLabel.FontColor = [0, 0, 1]; % 蓝色表示良好 elseif aw < 1.5 fig.UserData.evaluationLabel.FontColor = [1, 0.5, 0]; % 橙色表示一般 else fig.UserData.evaluationLabel.FontColor = [1, 0, 0]; % 红色表示较差 end % 更新图表 cla(fig.UserData.ax1); semilogx(fig.UserData.ax1, f, abs(H), 'LineWidth', 1.5); title(fig.UserData.ax1, sprintf('频率响应函数 |H(f)| (车速: %d km/h)', round(v_kmh))); xlabel(fig.UserData.ax1, '频率 (Hz)'); ylabel(fig.UserData.ax1, '|H(f)|'); grid(fig.UserData.ax1, 'on'); cla(fig.UserData.ax2); semilogx(fig.UserData.ax2, f, G_zdd, 'LineWidth', 1.5); title(fig.UserData.ax2, sprintf('加速度功率谱密度 (%s级路面)', roadClass)); xlabel(fig.UserData.ax2, '频率 (Hz)'); ylabel(fig.UserData.ax2, 'G_{z_s}(f) (m^2/s^4/Hz)'); grid(fig.UserData.ax2, 'on'); end帮我修改错误
09-12
function multi_format_reader() % 创建主界面 fig = uifigure('Name', '多格式文件处理器', 'Position', [100 100 450 300]); % 文件选择按钮 uibutton(fig, 'Position', [50 220 150 40], 'Text', '选择文件', ... 'ButtonPushedFcn', @(btn,event) select_file()); % 格式支持说明 uilabel(fig, 'Position', [50 150 350 60], ... 'Text', '支持格式: BMP(*.bmp), JPEG(*.jpg), PNG(*.png), TIFF(*.tif), DICOM(*.dcm), MATLAB数据(*.mat)', ... 'WordWrap', 'on'); % 文件信息显示 info_label = uilabel(fig, 'Position', [50 100 350 40], ... 'Text', '未选择文件', 'WordWrap', 'on'); % 文件读取函数 function select_file() % 设置文件过滤器 filter = {'*.bmp;*.jpg;*.jpeg;*.png;*.tif;*.tiff;*.dcm;*.mat', '所有支持格式'; '*.bmp', 'BMP图像 (*.bmp)'; '*.jpg;*.jpeg', 'JPEG图像 (*.jpg, *.jpeg)'; '*.png', 'PNG图像 (*.png)'; '*.tif;*.tiff', 'TIFF图像 (*.tif, *.tiff)'; '*.dcm', 'DICOM医疗图像 (*.dcm)'; '*.mat', 'MATLAB数据文件 (*.mat)'}; % 打开文件选择对话框 [filename, pathname] = uigetfile(filter, '选择文件'); if isequal(filename, 0) || isequal(pathname, 0) info_label.Text = '用户取消选择'; return; end filepath = fullfile(pathname, filename); [~, ~, ext] = fileparts(filename); try % 根据不同格式使用对应读取方法 switch lower(ext) case {'.bmp', '.jpg', '.jpeg', '.png', '.tif', '.tiff'} img = imread(filepath); process_image(img, filename); info_label.Text = sprintf('成功读取图像: %s\n尺寸: %dx%dx%d', ... filename, size(img,1), size(img,2), size(img,3)); case '.dcm' img = dicomread(filepath); metadata = dicominfo(filepath); process_image(img, filename); info_label.Text = sprintf('成功读取DICOM: %s\n患者: %s', ... filename, metadata.PatientName.FamilyName); case '.mat' data = load(filepath); info_label.Text = sprintf('成功读取MAT文件: %s\n变量列表: %s', ... filename, strjoin(fieldnames(data), ', ')); otherwise error('不支持的文件格式'); end catch ME info_label.Text = sprintf('读取失败: %s', ME.message); errordlg(sprintf('错误详情: %s', ME.message), '文件读取错误'); end end % 图像处理函数(示例) function process_image(img, filename) fig2 = figure('Name', ['图像预览 - ' filename], 'Position', [200 200 800 400]); subplot(1,2,1); imshow(img, []); title('原始图像'); % 添加简单处理(如灰度转换) if size(img, 3) == 3 subplot(1,2,2); gray_img = rgb2gray(img); imshow(gray_img); title('灰度转换'); end end end 现在修改代码,要求每次直接进入文件选择界面,不再经过什么多格式文件处理器,同时要能实现对多种文件进行二值化大津法处理(包含excel文件),最后显示原始图像和二值化后的图像
11-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值