9

有人知道在 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 是通过某种算法为每个数组独立生成的

4

3 回答 3

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

然后,你真的不需要构造 matrix B;您可以使用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

然后,每当您需要访问 的第 ''i'' 个对角元素时A,您都可以访问diag_A(i). 对于这种情况,按照以下几行创建一个函数很方便:

function a = access_matrix(A, diag_A, i, j)
  if (i!=j), 
    a = A(i,j);
  else
    a = diag_A(i);
  end
end

在 MATLAB 改进parfor.

于 2014-09-23T19:34:35.417 回答
2

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

根据 matlab 文档:

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

MATLAB 文档源

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

于 2013-03-23T14:50:01.597 回答
1

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

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

于 2016-01-21T20:25:34.520 回答