Matlab编写RQ Givens分解函数报Brace indexing错误如何解决
报错原因
你遇到的报错是因为rq_givens函数最终返回的R、Q是普通数值矩阵,但你无法修改的调用代码中使用大括号{}对R、Q做元胞数组索引,变量类型不匹配就会触发该错误。
原来的函数虽然开头初始化了Q = { eye(size(A,2)) }、R = { A }的元胞数组,但后续计算逻辑直接把Q、R覆盖为了普通数值矩阵,且没有存储每一步迭代的结果到元胞数组中,不符合调用代码的输入要求。
修改方案
修改点如下:
- 保留元胞数组存储每一步迭代的
R、Q结果,不要用普通矩阵覆盖返回值 - 每完成一次Givens旋转后,同步存储当前的上三角矩阵迭代结果和正交矩阵迭代结果到对应元胞数组
- 可选优化:将
atan(y/x)替换为atan2(y,x),避免x为0时出现除零错误
修改后的完整代码
function [R, Q] = rq_givens(A) % 初始化存储迭代结果的元胞数组,第一个元素为初始值 R = {A}; Q = {eye(size(A,2))}; I = eye(size(A,1)); Qs = {}; k = 1; for i = 1:size(A,2) for j = size(A,1):-1:i+1 y = -A(j,i); x = A(i,i); alpha = atan2(y,x); % 替换原有atan避免除零问题 c = cos(alpha); s = sin(alpha); temp = I; temp(i,i) = c; temp(i,j) = -s; temp(j,i) = s; temp(j,j) = c; A = temp * A; Qs{k} = temp; k = k + 1; % 计算当前累积的Q矩阵,存储到元胞数组 current_Q = I; for m = k-2:-1:1 current_Q = current_Q * Qs{m}; end current_Q = current_Q'; % 将当前迭代的R、Q存入元胞数组 R{end+1} = A; Q{end+1} = current_Q; end end end
验证说明
修改后函数返回的R、Q均为元胞数组,每一位对应每一步Givens旋转后的迭代结果,和调用代码的索引逻辑完全匹配,不会再触发大括号索引报错。最终的R{end}*Q{end}结果和原矩阵A的误差在浮点精度范围内。
内容的提问来源于stack exchange,提问作者B.Y
相关产品推荐
相关产品推荐

