Matlab中迭代拼接子矩阵H生成大矩阵Gamma的实现问题
可行实现代码(两种方案可选)
方案1:预分配内存(运行效率更高,推荐)
function [Gamma] = get_Gamma(N,A,B,Cz) % 生成所有H子矩阵,注意此处Ad、Bd和输入参数A、B的对应关系,如有误可自行调整 Ad = A; Bd = B; for i=1:N H(:,:,i) = Cz*Ad^(i-1)*Bd; end Hn = size(H,1); Hm = size(H,2); % 预分配Gamma的内存空间 Gamma = zeros(N*Hn, N*Hm); for i = 1:N % 计算当前块行对应的全局行坐标范围 row_start = (i-1)*Hn + 1; row_end = i*Hn; for j = 1:i % 计算当前非零块对应的全局列坐标范围 col_start = (j-1)*Hm + 1; col_end = j*Hm; Gamma(row_start:row_end, col_start:col_end) = H(:,:, i-j+1); end end end
方案2:按逐行拼接逻辑实现(和你给出的示例逻辑对齐)
function [Gamma] = get_Gamma(N,A,B,Cz) % 生成所有H子矩阵,注意此处Ad、Bd和输入参数A、B的对应关系,如有误可自行调整 Ad = A; Bd = B; for i=1:N H(:,:,i) = Cz*Ad^(i-1)*Bd; end Hn = size(H,1); Hm = size(H,2); Gamma = []; for i = 1:N % 生成当前行的所有块 cur_row = []; for j = 1:N if j <= i cur_row = [cur_row, H(:,:, i-j+1)]; else cur_row = [cur_row, zeros(Hn, Hm)]; end end % 将当前行拼接到Gamma底部 Gamma = [Gamma; cur_row]; end end
原代码问题说明
原有代码的核心问题是嵌套循环中行列拼接逻辑混乱,在列拼接的内层循环里错误插入了行拼接操作,同时子矩阵H的索引规则设置错误,导致输出结构不符合要求。
内容的提问来源于stack exchange,提问作者Grétar Már
相关产品推荐
相关产品推荐

