使用MATLAB求解主特征值时遭遇索引超出范围错误
代码错误排查与修正
你的代码出现Index exceeds the number of array elements. Index must not exceed 1.错误,核心问题有两个:收敛判断逻辑错误,fprintf使用格式错误,同时可能存在工作区残留变量干扰的情况。
原始代码问题分析
- 收敛判断错误:
if abs(b-b0)<tol中,b和b0都是5×1列向量,abs(b-b0)会生成5×1的逻辑向量,MATLAB的if语句要求条件为标量逻辑值,这种写法会导致后续逻辑混乱,甚至可能意外修改变量维度。 fprintf格式错误:你的fprintf语句缺少格式化占位符,无法正确输出变量,且错误地将向量b作为特征值输出(实际特征值的近似是M)。- 潜在工作区干扰:如果之前运行过其他代码导致
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
相关产品推荐
相关产品推荐

