prova.mat在MATLAB中考虑以下列方式获得
for w=1:100
for p=1:9
A{p}=randn(100,1);
end
baseA_.A=A;
eval(['baseA.A' num2str(w) '= baseA_;'])
end
save(sprintf('prova.mat'),'-v7.3', 'baseA')
Run Code Online (Sandbox Code Playgroud)
为了了解我的数据中的实际维度,1x9 cellin A1由以下9数组组成:904x5, 913x5, 1722x5, 4136x5, 9180x5, 3174x5, 5970x5, 4455x5, 340068x5.另一个Aj有类似的构成.
请考虑以下代码
clear all
load prova
tic
parfor w=1:100
indA=sprintf('A%d', w);
Aarr=baseA.(indA).A;
Boot=[];
for p=1:9
C=randn(100,1).*Aarr{p};
Boot=[Boot; C];
end
D{w}=Boot;
end
toc
Run Code Online (Sandbox Code Playgroud)
如果我在我的Macbook Pro中parfor使用4本地工作人员运行循环,则需要1.2秒.parfor用for它替换需要0.01秒.
根据我的实际数据,时间差为31秒对7秒[矩阵的创建C也更复杂].
如果已正确理解问题是计算机必须发送baseA给每个本地工作人员,这需要时间和内存.
您能否提出一个能够parfor比方便更方便的解决方案for?我认为保存所有单元格baseA是一种通过在开始时加载一次来节省时间的方法,但也许我错了.
我是关于matlab并行计算的新手.我有一个创建分类器(SVM)的函数,我想用几个数据集测试它.我有一个2核工作站,所以我想并行运行测试.有人可以解释我之间的区别:
dataset_array={dataset1, dataset2}
matlabpool open 2
spmd
my_function(dataset(labindex));
end
Run Code Online (Sandbox Code Playgroud)
和
dataset_array={dataset1, dataset2}
matlabpool open 2
parfor i:1=2
my_function(dataset(i));
end
Run Code Online (Sandbox Code Playgroud) 三角形数字的序列是通过将自然数相加而生成的。因此,第7 个三角数将是1+2+3+4+5+6+7 = 28。前十个术语为:1, 3, 6, 10, 15, 21, 28, 36, 45, 55。前四个三角形中包含的因子是:
1: 1
3: 1, 3
6: 1, 2, 3, 6
10: 1, 2, 5, 10
Run Code Online (Sandbox Code Playgroud)
我们看到这6是第一个具有四个除数的三角形。
为了找到第一个三角数超过500的除数,我编写了以下代码:
1: 1
3: 1, 3
6: 1, 2, 3, 6
10: 1, 2, 5, 10
Run Code Online (Sandbox Code Playgroud)
我想使用parfor而不是for在外循环上加快此代码的速度。但是,我得到了错误:
错误:变量s1可能旨在作为归约变量,但实际上是未初始化的临时变量。
请参见MATLAB中的Parallel for Loops,“拟为归约变量的临时变量”。
如何并行化此代码?