Matlab parfor循环索引

时间:2013-03-22 19:08:44

标签: matlab parfor

有人知道在matlab中使用parfor在这个简单的代码中发生了什么吗? 谢谢,

我将矩阵切成四个数组,并希望独立更新每个数组中的元素

这是一个简单的版本:

a = zeros(4,4);  
parfor i = 1:4  
    j = 2;      
    a(j,i) = 3;  
end

错误:' a'的有效索引在parfor循环中受到限制;

然而,

这有效:

a = zeros(4,4);  
parfor i = 1:4  
    a(2,i) = 3;  
end

另一个更简单的非工作版本,具有相同的错误:

a = zeros(4,4);  
parfor i = 1:4  
    a(i,i) = 3;  
end

在我的应用程序中,索引j是通过某种算法

为每个数组独立生成的

3 个答案:

答案 0 :(得分:3)

只是我的两分钱:正如@mmumbos已经解释过的那样,你想要实现的目标是不可能的,但某些变通方法仍然适用。

让我们假设你需要实现类似下面的东西(这是矩阵A的线性变换的排列):

n=10;
A=rand(n,n);
B=zeros(n,n);
parfor i=1:n,
  j=(i<=5)*(2*(i-1)+1)+(i>5)*(2*(i-5));
  B(j,i) = my_function(A(i,:));
end

请尝试以下方法:

parfor i=1:n,
  B_temp(i,:) = my_function(A(i,:));
end

然后,你真的不需要构造矩阵B;您可以使用{'1}}使用''索引表'来访问它,该索引表的构造如下:

B_temp

然后通过J=zeros(n,1); parfor i=1:n, J(i) = (i<=5)*(2*(i-1)+1)+(i>5)*(2*(i-5)); end 访问B(i)

再次访问您的上一个(计数器)示例,让我们看看如何解决它:

B_temp(J(i))

然后,只要您需要访问n=4; diag_A = zeros(n,1); parfor i=1:n, diag_A(i)=3; % or any function of i end 的'''' - 对角元素,就可以访问A。对于这种情况,可以方便地按以下行创建函数:

diag_A(i)

在MATLAB改进function a = access_matrix(A, diag_A, i, j) if (i!=j), a = A(i,j); else a = diag_A(i); end end 的实现之前,很多情况下(遗憾的是)这些变通办法是必要的。

答案 1 :(得分:2)

你想要达到的目标似乎是不可能的。

根据matlab文档:

  

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

MATLAB Documentation Source

因此,除了循环变量之外,用于索引数组的所有变量都必须在整个循环中保持不变。

答案 2 :(得分:1)

由于尚未提及,这里的链接对于诊断这些类型的问题非常有用:Classification of Variables in Parfor。当MATLAB无法将变量分类为在该页面上概述的严格定义时,会出现这些问题。

这里发生的是它不知道如何在循环之前切片“切片变量”A.考虑自己编写并行实现。您想要做的是将A切换成您知道其他处理器不会触及的偶数块,然后将它们分配给不同的CPU以独立行动。 MATLAB查看你的循环并且不知道如何执行此操作,因为它在运行程序之前不知道j是什么。这是MATLAB的一个限制。如果使用像A(i * j,:)这样的复杂系数,会出现同样情况的另一种情况。再一次,它不知道如何拆分它。