有人知道在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是通过某种算法
为每个数组独立生成的答案 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语句时是不变的。您无法将循环变量与其自身组合以形成索引表达式。
因此,除了循环变量之外,用于索引数组的所有变量都必须在整个循环中保持不变。
答案 2 :(得分:1)
由于尚未提及,这里的链接对于诊断这些类型的问题非常有用:Classification of Variables in Parfor。当MATLAB无法将变量分类为在该页面上概述的严格定义时,会出现这些问题。
这里发生的是它不知道如何在循环之前切片“切片变量”A.考虑自己编写并行实现。您想要做的是将A切换成您知道其他处理器不会触及的偶数块,然后将它们分配给不同的CPU以独立行动。 MATLAB查看你的循环并且不知道如何执行此操作,因为它在运行程序之前不知道j是什么。这是MATLAB的一个限制。如果使用像A(i * j,:)这样的复杂系数,会出现同样情况的另一种情况。再一次,它不知道如何拆分它。