我有一个函数文件,它模拟1000个时间步的矩阵A(大小为100*100),并将最终结果生成为A_t1000 (大小为100*100的矩阵)。
例如,如果A= 100*100 at t0,则A_t1= 100*100;A_t2=100*100;……。。A_t1000=100*100矩阵。每一个都有不同的值,所以我可以有从A_t1到A_t1000的多个A切片。
我的脚本文件将这个过程迭代100次。脚本文件调用此函数并生成最终输出矩阵B_t1000 = A_t1000 * 100。B_t1000是包含100个A的最终输出矩阵。B_t1000维度为100*100*100。函数文件的起始输入参数在脚本文件的开头提供。
我正在尝试使用‘parfor’来运行这段代码。目标是在单独的核心中独立运行每个迭代,然后在结束时收集它们以生成B。当前代码如下所示
iter=100;
p=0.8;N=1200;
maxgen=1000;
d=0.01;
evalues=(d/2):d:(1-d/2);
cvalues=(d/2):d:(1-d/2); %% p, N are starting parameters
[C,E]=meshgrid(cvalues,evalues); %% Starting 10,000 combinations
B_t1000 = []; %% initializing B_t1000
B_t200= []; %% initializing B_t200
parfor k=1:iter
A_t1000= zeros(length(evalues),length(cvalues)); %%initializing A_t1000
A_t200 = zeros(length(evalues),length(cvalues)); %%initializing A_t200
for i=1:length(evalues)
for j=1:length(cvalues)
e=evalues(i); % starting point input for e for function file
c=cvalues(j); % starting point input for c for function file
[A_t1000, A_t200] = function (e,c,p,N,maxgen); %% calling a function to generate A_t1000 and A_t200
end
end
B_t1000 (1:length(evalues),1:length(cvalues),k) = A_t1000;
B_t200 (1:length(evalues),1:length(cvalues),k) = A_t1000;
end我收到一条错误消息--“无法对parfor中的变量B_t1000进行分类”。我猜这与独立性和索引问题有关。
有人能帮我用parfor运行这段代码吗?
'Ne‘和'maxgen’参数越大,只使用'for‘循环运行代码的时间就越长。目前较大的参数在不使用parfor的情况下运行时间超过30小时。我希望使用parfor显著减少这一时间。
有什么建议吗?谢谢!
发布于 2015-12-06 13:57:14
将结果的数据类型更改为单元格数组。
要初始化使用:
B_t1000 = cell(1,iter); %% initializing B_t1000
B_t200= cell(1,iter); %% initializing B_t200然后在parfor循环中
B_t1000{k} = A_t1000;
B_t200{k} = A_t1000;如果您确实需要将结果转换为3D矩阵,则在parfor之后对其进行转换。
发布于 2015-12-06 21:44:56
代码中的B_t1000和B_t200是循环中的切片变量。您代码的问题是,parfor的循环变量(在本例中为k)只能用作一级索引,而您将其用作第三级索引。
请参阅MATLAB官方文档:http://nl.mathworks.com/help/distcomp/sliced-variables.html
快速修复代码,将初始化代码更改为:
B_t1000 = zeros(iter,length(evalues),length(cvalues)); %% initializing B_t1000
B_t200= zeros(iter,length(evalues),length(cvalues)); %% initializing B_t200并将parfor循环中的赋值更改为:
B_t1000 (k,:,:) = A_t1000;
B_t200 (k,:,:) = A_t1000;现在使用parfor循环变量k作为B_t1000和B_t200的一级索引。您还可以将B_t1000和B_t200定义为单元格阵列。有时它会让事情变得更容易理解。
https://stackoverflow.com/questions/34113662
复制相似问题