You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Matlab子图索引报错:下标需为正整数或逻辑值的解决方法

修复Matlab下标错误:Subscript indices must either be real positive integers or logicals

首先得明确你遇到这个错误的核心原因:你在访问数组元素时,用了负数、小数这类不符合要求的值当下标——Matlab对数组下标有严格要求,必须是正整数(比如array(5))或者逻辑数组(比如array([true, false]),但你的时间数组t包含负数和小数,直接拿它当下标肯定会触发报错。

下面是具体的修复步骤和正确代码示例:

1. 正确创建时间数组

先把时间数组定位成正弦函数的自变量,而不是数组下标。注意把毫秒转成秒(Matlab三角函数参数是弧度,结合Hz频率的话,用秒单位更直观):

% 生成-10ms到10ms的1000个均匀样本,转换为秒单位
t = linspace(-10e-3, 10e-3, 1000);

2. 计算不同振幅和频率的正弦信号

假设你要测试多组振幅和频率,正确的计算方式如下:

% 定义要测试的振幅和频率(频率单位为Hz)
amplitudes = [1, 2, 3];
frequencies = [100, 500, 1000];

% 预分配存储信号的数组,提升计算效率
signals = zeros(length(t), length(amplitudes));

% 循环计算每个正弦信号
for i = 1:length(amplitudes)
    signals(:,i) = amplitudes(i) * sin(2*pi*frequencies(i)*t);
end

3. 绘制子图(避免用时间数组当下标)

绘制子图时,直接用t作为x轴数据,对应的信号列作为y轴数据即可:

figure;
for i = 1:length(amplitudes)
    subplot(length(amplitudes), 1, i);
    plot(t, signals(:,i));
    xlabel('时间 (s)');
    ylabel('振幅');
    title(['振幅=', num2str(amplitudes(i)), ', 频率=', num2str(frequencies(i)), 'Hz']);
    xlim([-10e-3, 10e-3]); % 限定x轴范围为-10ms到10ms
end
sgtitle('不同振幅和频率的正弦信号');

常见错误场景排查

如果你之前的代码是类似下面这样,就会触发错误:

% 错误示例:误用时间数组t作为下标访问信号数组
t = linspace(-10e-3,10e-3,1000);
y = sin(2*pi*100*t);
plot(t, y(t)); % 这里y(t)是错误写法,t不是正整数下标!

修复方法很简单,直接用y作为y轴数据:plot(t, y);

总结来说,关键是要区分自变量(时间数组t)数组下标:时间数组是用来生成正弦函数输入值的,不是用来索引数组的下标。只要避免写出array(t)这类用非正整数当下标的代码,就能解决这个问题。

内容的提问来源于stack exchange,提问作者popeye

火山引擎 最新活动