Matlab while循环维度矩阵错误:索引越界问题排查
问题:生成31x5矩阵时遭遇索引越界错误
需求与输入说明
目标是生成一个31x5的profit1矩阵,涉及输入:
prodordered:24x5矩阵hourlydata.demand:24x1矩阵cncordered:24x5矩阵
当前代码:
nplants=5 nhours=24 for j =nplants:-1:1 for comb = fliplr(nchoosek(1:nplants, j).') outage = ones(nhours, nplants); outage(:, comb) = 0; % make columns zero prodout = outage.*prodordered; meritorder = prodout(:,1); for i=2:nplants, meritorder(:,i) = meritorder(:,i-1) + prodout(:,i); end active = zeros(nhours,nplants); active(:,1) = ones(nhours,1); for i=1:nhours, k = 1; while meritorder(i,k) <= hourlydata.demand(i) k = k+1; active(i,k) = 1; end end supply = active.*prodout; varcost1 = active.*outage.*cncordered; totsupout = sum(supply,2); priceout = max(varcost1')'; hourlyprofit1=(repmat(priceout,1,5)-varcost1).*prodout; profit1(:,j) = sum(hourlyprofit1); end end
报错信息
Index in position 2 exceeds array bounds. Index must not exceed 5.
while meritorder(i,k) <= hourlydata.demand(i)
问题分析与修复方案
1. 索引越界原因
while循环中k会持续递增,当meritorder(i,k)的累计值始终小于等于hourlydata.demand(i)时,k会超过nplants(即5),但meritorder是24x5矩阵,列索引最大为5,因此触发越界错误。
2. 修复步骤
(1)限制while循环的k范围
修改while条件,添加k <= nplants的判断,同时避免给超出范围的列赋值:
while k <= nplants && meritorder(i,k) <= hourlydata.demand(i) k = k+1; if k <= nplants active(i,k) = 1; end end
(2)正确初始化并填充profit1矩阵
原代码未初始化profit1,且直接按列赋值无法生成31行结构。先计算总组合数(5选1+5选2+5选3+5选4+5选5=31),初始化矩阵后用计数器跟踪行索引:
nplants=5 nhours=24 total_combs = sum(nchoosek(nplants, 1:nplants)); % 计算总组合数31 profit1 = zeros(total_combs, nplants); row_idx = 1; % 行索引计数器 for j =nplants:-1:1 for comb = fliplr(nchoosek(1:nplants, j).') outage = ones(nhours, nplants); outage(:, comb) = 0; % make columns zero prodout = outage.*prodordered; meritorder = prodout(:,1); for i=2:nplants, meritorder(:,i) = meritorder(:,i-1) + prodout(:,i); end active = zeros(nhours,nplants); active(:,1) = ones(nhours,1); for i=1:nhours, k = 1; while k <= nplants && meritorder(i,k) <= hourlydata.demand(i) k = k+1; if k <= nplants active(i,k) = 1; end end end supply = active.*prodout; varcost1 = active.*outage.*cncordered; totsupout = sum(supply,2); priceout = max(varcost1')'; hourlyprofit1=(repmat(priceout,1,5)-varcost1).*prodout; profit1(row_idx, j) = sum(hourlyprofit1); row_idx = row_idx + 1; % 每个组合对应一行 end end
修改后既解决了索引越界问题,也能正确生成31x5的profit1矩阵。
内容的提问来源于stack exchange,提问作者Lilia
相关产品推荐
相关产品推荐

