有人知道在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是通过某种算法为每个数组独立生成的
发布于 2014-09-24 03:34:35
我只有两点意见:正如@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_temp访问它,索引表的结构简单如下:
J=zeros(n,1);
parfor i=1:n,
J(i) = (i<=5)*(2*(i-1)+1)+(i>5)*(2*(i-5));
end然后通过B_temp(J(i))访问B(i)。
回顾上一个(计数器)示例,让我们看看如何解决它:
n=4;
diag_A = zeros(n,1);
parfor i=1:n,
diag_A(i)=3; % or any function of i
end然后,无论何时需要访问A的第‘’i‘’个对角元素,都可以访问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的实现之前,这种变通方法在很多情况下都是必要的(不幸的)。
发布于 2013-03-23 22:50:02
你试图实现的目标似乎是不可能的。
根据matlab文档:
当您将其他变量与循环变量一起使用来索引数组时,不能在循环内设置这些变量。实际上,这些变量在整个parfor语句的执行过程中都是常量。您不能将循环变量与其自身组合以形成索引表达式。
MATLAB Documentation Source
因此,除循环变量外,用于索引数组的所有变量在整个循环中都必须是常量。
发布于 2016-01-22 04:25:35
由于它还没有被提及,这里有一个对诊断这些类型的问题非常有帮助的链接:Classification of Variables in Parfor。当MATLAB不能将变量分类到它在该页面上概述的严格定义中时,这些问题就会出现。
这里发生的事情是,它不知道如何在循环之前对“切片变量”A进行切片。考虑一下自己编写并行实现。你想要做的是把A分割成一些你知道其他处理器不会碰的碎片,然后把它们分配给不同的CPU,让它们独立运行。MATLAB看着你的循环,不知道怎么做,因为它不知道j是什么,直到它运行程序。这是MATLAB的局限性。另一种情况是,如果使用复系数A(i*j,:),也会发生同样的事情。再一次,它不知道如何分割它。
https://stackoverflow.com/questions/15578100
复制相似问题