通过改变索引解决分类错误,为什么?

时间:2016-08-11 07:58:23

标签: matlab parfor

我希望使用import array import sys lowLevelArray = array.array("i", [1,2,3]) print sys.getsizeof(lowLevelArray[0]) pythonList = [1,2,3] print sys.getsizeof(pythonList[0]) 作为嵌套循环,我已经举例说明了我的结构:

parfor

MATLAB给出了错误:temp_vars = 1:10; global_arr = zeros(10,10); parfor i=0:9 for j=0:9 constant_var = temp_vars(i+1); global_arr(i+1, j+1) = i*j*constant_var; end end

但是,如果我将Error: The variable global_arr in a parfor cannot be classified.i的值更改为j而不是1..10,那么它会神奇地运作良好。那是为什么?

1 个答案:

答案 0 :(得分:1)

问题是您使用相对索引而不是绝对索引来引用global_arr(即i+1而不是i)。当你使用并行for时,global_arr的每个'切片'都是独立计算它在循环中的位置,相对索引意味着依赖位置,这是禁止的。

请改为尝试:

parfor i = 1:10;
    for j = 1:10;
        constant_var = temp_vars(i);
        global_arr(i, j) = (i-1)*(j-1)*constant_var;
    end
end

更准确地说,只有parfor循环中的第一个索引可以依赖于循环迭代器,所有其他索引都被视为常量。因此,您可以以相对方式使用i,但不能j

parfor i = 0:9;
    for j = 1:10;
        constant_var = temp_vars(i+1);
        global_arr(i+1,j) = i*(j-1)*constant_var;
    end
end

From MATLAB doc

  

当您使用其他变量和循环变量来索引时   数组,你不能在循环内设置这些变量。实际上,这样的   变量在执行整个parfor时是不变的   声明。您无法将循环变量与其自身组合以形成   索引表达。