You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MATLAB求解主特征值时遭遇索引超出范围错误

代码错误排查与修正

你的代码出现Index exceeds the number of array elements. Index must not exceed 1.错误,核心问题有两个:收敛判断逻辑错误,fprintf使用格式错误,同时可能存在工作区残留变量干扰的情况。

原始代码问题分析

  1. 收敛判断错误:if abs(b-b0)<tol中,b和b0都是5×1列向量,abs(b-b0)会生成5×1的逻辑向量,MATLAB的if语句要求条件为标量逻辑值,这种写法会导致后续逻辑混乱,甚至可能意外修改变量维度。
  2. fprintf格式错误:你的fprintf语句缺少格式化占位符,无法正确输出变量,且错误地将向量b作为特征值输出(实际特征值的近似是M)。
  3. 潜在工作区干扰:如果之前运行过其他代码导致b被意外赋值为标量/其他维度变量,再次运行时会破坏初始的向量维度,引发索引错误。

修正后的代码

A = [1 2 4 8 16; 2 2 0 0 0; 4 0 4 0 0; 8 0 0 8 0; 16 0 0 0 16]; % 问题矩阵
b = [1;1;1;1;1]; % 初始猜测向量
n = 100; % 迭代次数
tol = 0.001; % 容差
b0 = b;

for count = 1:n
    b = A * b0;
    M = max(b); % 提取当前迭代的特征值近似
    b = b / M; % 归一化向量
    
    % 使用向量的2范数判断收敛,避免元素-wise比较的逻辑错误
    if norm(b - b0) < tol
        break;
    end
    
    b0 = b;
    % 正确格式化输出迭代次数和特征值近似
    fprintf('Iteration #%d: Eigenvalue approximation is %.4f\n', count, M);
end

% 输出最终结果
fprintf('Final eigenvalue approximation after %d iterations: %.4f\n', count, M);

修正说明

  • 用norm(b - b0) < tol替代元素-wise比较,通过向量的范数判断整体收敛情况,符合幂法的收敛逻辑。
  • 修正fprintf的格式字符串,添加%d(整数占位符)和%.4f(浮点数占位符),正确输出迭代次数和特征值近似值(M才是特征值的近似,而非向量b)。
  • 确保每次迭代的向量维度正确,运行前可使用clear all; clc;清空工作区,避免残留变量干扰。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:35:44