超过百万的数组——解决方法

本文探讨了在函数内部声明大型数组导致栈内存溢出的问题,并提供了两种解决方案:一是将数组声明为全局变量;二是将数组分配在堆上。通过示例代码详细展示了这两种方法的具体实现。
数组申明在函数内部,属于局部变量,存放在了栈上,
看看数组占用的内存大小:1000000=1000*1000然后乘以int型数据长度
1000*1000*4byte约等于4M,
而栈的默认内存空间为1M左右,所以会导致内存溢出
解决这个问题,可以将数组申明在全局存储区或堆上即可
方法一:申明为全局变量

方法二:存放在堆上

方法一:申明为全局变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
#include<algorithm>
using  namespace  std;
int  list[1000000]; //全局变量
int  main(){
     int  a,b;
     cin>>a;
     for (b=0;b<a;b++)
         cin>>list[b];
     sort(list,list+a);
     for (b=0;b<a;b++)
         cout<<list[b]<<endl;
 
     return  0;
}

方法二:存放在堆上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
#include<algorithm>
using  namespace  std;
int  main(){
     int  a,b,*list;
     //int list[1000000];
     list =  new  int [1000000]; //存放在堆上
     cin>>a;
     for (b=0;b<a;b++)
         cin>>list[b];
     sort(list,list+a);
     for (b=0;b<a;b++)
         cout<<list[b]<<endl;
 
     return  0;
}
### Matlab 中粒子群优化算法 '索引超过数组元素' 的错误解决方案 在 MATLAB 实现粒子群优化(PSO)或多目标粒子群优化(MOPSO)算法时,“索引超过数组元素”的错误通常是由以下几个原因引起的: #### 1. **初始化参数不足** 如果某些变量未正确初始化或者其维度小于后续访问所需的范围,则可能导致此错误。例如,在定义种群规模 `N` 和维数 `D` 时,如果没有正确设置初始条件,可能会引发越界问题。 ```matlab % 初始化种群位置和速度矩阵 Pop = rand(N, D); % 种群位置 Vel = zeros(N, D); % 初始速度设为零 ``` 确保所有涉及的数组均按照实际需求进行了预分配[^3]。 --- #### 2. **边界处理不当** 在更新粒子位置或速度的过程中,如果不小心超出预定界限也可能触发此类警告。比如下面这段代码片段展示了如何防止越界的逻辑: ```matlab for i = 1:N for j = 1:D if Pop(i,j) < lb(j) Pop(i,j) = lb(j); elseif Pop(i,j) > ub(j) Pop(i,j) = ub(j); end end end ``` 此处 `lb` 表示下限而 `ub` 是上限向量[^5]。 --- #### 3. **适应度评估过程中的疏漏** 当计算个体最佳 (`pBest`) 或全局最佳 (`gBest`) 解决方案时,若存在空指针引用或是尝试读取不存在的数据项同样会造成异常情况发生。为此建议加入必要的验证机制以确认数据有效性之前再继续下一步骤操作: ```matlab if ~isempty(fitnessValues) [~, idx] = min(fitnessValues); else error('Fitness values array is empty.'); end ``` 通过这样的方法可以在一定程度上规避潜在风险[^4]。 --- #### 4. **存档管理失误** 针对 MOPSO 特有的外部档案维护环节里可能出现的问题——即每当新发现非劣解需纳入存储器却因容量限制不得不淘汰旧成员之时,倘若选取规则制定不合理亦容易造成非法访问现象出现。所以应该采用恰当策略来进行筛选工作,像文中提到利用网格密度作为评判标准之一便是不错的选择[^5]。 --- 综上所述,要彻底根治 “Index exceeds matrix dimensions.” 类型报错事件的发生频率可以从上述几个方面入手逐一排查直至最终定位根本诱因所在为止。 ```matlab function [bestPosition,bestValue]=simplePSO(func,N,D,w,c1,c2,maxIter,lb,ub) % ...省略其他部分... try while iter<=maxIter % 更新速度与位置 Vel=w.*Vel+c1.*rand().*(Pbest-Pop)+c2.*rand().*(Gbest(ones(size(Pop,1),1),:)-Pop); Pop=Pop+Vel; % 边界控制 for i=1:size(Pop,1) for d=1:size(Pop,2) if Pop(i,d)<lb(d)||Pop(i,d)>ub(d) Pop(i,d)=lb(d)+(ub(d)-lb(d))*rand(); end end end fitness=fobj(Pop); % 更新 pBest 及 gBest updatePBGB(fitness,Pbest,Gbest); iter=iter+1; end catch ME disp(['Error occurred:',ME.message]); end end ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值