Matlab中并行处理期间的错误 [英] Error during parallel processing in Matlab

查看:218
本文介绍了Matlab中并行处理期间的错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个(很长的)带有嵌套循环的Matlab代码,在这里我想并行化主要的耗时迭代. (显然)给我带来问题的唯一变量是DMax,出现错误:

I have this (quite long) Matlab code with nested loops where I want to parallelize the main time-consuming iteration. The only variable that (apparently) gives me problems is DMax, where I get the error:

Error: The variable DMax in a `parfor` cannot be classified.
See Parallel for Loops in MATLAB, "Overview".

这是我的代码草稿:

t0=matrix (Maxiter,1); % This is a big matrix whose dimensions are reported in brachets
Maxiter = 1E6;
DMax = zeros(Maxiter,40);
% Other Stuff
for j=1:269 
     % Do more stuff
     for soil=1:4
        parfor i =1:Maxiter        
            k(i,soil) = a %k is a real number
            a(i,soil) = b %similar to k
            % Do a lot of stuff
            for t= (floor(t0(i,soil))+1):40
                DMax(i,t) = k(i,soil)*((t-t0(i,soil))^a(i,soil));
                % Do some more stuff
            end
        end
    end
end
for time=1:40
   % Do the final stuff
end

我想问题出在我定义DMax的方式上,但是我不知道它可能更精确.我已经在网上看过了,但结果却不太令人满意.

I guess the problem is in the way I defined DMax, but I do not know what it could be more precisely. I already looked on the web but with not very satisfying results.

推荐答案

所有以下条件都必须满足:

It is very clearly described in the documentation that each variable inside parfor must be classified into one of several types. Your DMax variable should be a sliced variable (arrays whose segments are operated on by different iterations of the loop), but in order to be classified as such, all the following conditions must hold:

  • 一级索引的类型-一级索引是括号()或大括号{}.
  • 固定索引列表-在第一级括号或大括号内,所有出现的 给定变量.
  • 索引的形式-在变量的索引列表中,恰好有一个索引涉及循环变量.
  • 阵列的形状-阵列保持恒定的形状.在分配切片变量时,赋值的右侧不能为[]或'',因为这些运算符会尝试
    删除元素.
  • Type of First-Level Indexing — The first level of indexing is either parentheses, (), or braces, {}.
  • Fixed Index Listing — Within the first-level parenthesis or braces, the list of indices is the same for all occurrences of a given variable.
  • Form of Indexing — Within the list of indices for the variable, exactly one index involves the loop variable.
  • Shape of Array — The array maintains a constant shape. In assigning to a sliced variable, the right-hand side of the assignment cannot be [] or '', because these operators attempt to
    delete elements.

很显然,固定索引列表属性不成立,因为您将其引用为DMax(i,t),其中t会更改其值.文档中有一个相同的示例,请注意.因此,一种解决方法是在内部循环内使用一个临时变量,然后将整个行分配回DMax.

Clearly, Fixed Index Listing property does not hold since you reference it as DMax(i,t) where t changes its values. There's an identical example described in the documentation, please pay attention. So one workaround would be to use a temporary variable inside the inner loop, and then assign the whole row back to DMax.

还请注意,变量a也不能分类为任何类别.更不用说您的示例中完全没有定义它.请仔细阅读该指南,并确保可以将其分类为以下类别之一.根据需要重写代码,例如引入新的临时变量.

Also note that variable a cannot be classified into any category either. That's not to mention that it's not defined in your example at all. Please read the guide carefully and make sure it can be classified into one of the categories. Rewrite the code if needed, e.g. introducing new temporary variables.

以下是纠正了DMax使用情况的代码:

Here's the code where DMax usage is corrected:

Maxiter = 1E6;
t0 = randn(Maxiter,1); % This is a big matrix whose dimensions are reported in brachets
DMax = zeros(Maxiter,40);
% Other Stuff
for j = 1:269 
     % Do more stuff
     for soil = 1:4
        parfor i = 1:Maxiter        
            k(i,soil) = a %k is a real number
            a(i,soil) = b %similar to k
            % Do a lot of stuff
            tmp = zeros(1,40);
            for t = (floor(t0(i,soil))+1):40
                tmp(t) = k(i,soil)*((t-t0(i,soil))^a(i,soil));
                % Do some more stuff
            end
            DMax(i,:) = tmp;
        end
    end
end
for time = 1:40
   % Do the final stuff
end

这篇关于Matlab中并行处理期间的错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆