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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:15:32