首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab parfor循环索引

Matlab parfor循环索引
EN

Stack Overflow用户
提问于 2013-03-23 03:08:44
回答 3查看 5K关注 0票数 9

有人知道在matlab中使用parfor这段简单的代码是怎么回事吗?谢谢,

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

下面是一个简单的版本:

代码语言:javascript
复制
a = zeros(4,4);  
parfor i = 1:4  
    j = 2;      
    a(j,i) = 3;  
end

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

然而,

这是可行的:

代码语言:javascript
复制
a = zeros(4,4);  
parfor i = 1:4  
    a(2,i) = 3;  
end

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

代码语言:javascript
复制
a = zeros(4,4);  
parfor i = 1:4  
    a(i,i) = 3;  
end

在我的应用程序中,索引j是通过某种算法为每个数组独立生成的

EN

回答 3

Stack Overflow用户

发布于 2014-09-24 03:34:35

我只有两点意见:正如@mmumbos已经解释的那样,您试图实现的目标不可能以这种方式实现,但某些变通方法仍然可以应用。

让我们假设您需要实现如下内容(这是矩阵A的线性变换的排列):

代码语言:javascript
复制
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

请尝试执行以下操作:

代码语言:javascript
复制
parfor i=1:n,
  B_temp(i,:) = my_function(A(i,:));
end

然后,您实际上不需要构造矩阵表;您可以使用‘’索引表‘’使用B_temp访问它,索引表的结构简单如下:

代码语言:javascript
复制
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)

回顾上一个(计数器)示例,让我们看看如何解决它:

代码语言:javascript
复制
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)。对于这种情况,可以按照以下方式创建函数:

代码语言:javascript
复制
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的实现之前,这种变通方法在很多情况下都是必要的(不幸的)。

票数 3
EN

Stack Overflow用户

发布于 2013-03-23 22:50:02

你试图实现的目标似乎是不可能的。

根据matlab文档:

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

MATLAB Documentation Source

因此,除循环变量外,用于索引数组的所有变量在整个循环中都必须是常量。

票数 2
EN

Stack Overflow用户

发布于 2016-01-22 04:25:35

由于它还没有被提及,这里有一个对诊断这些类型的问题非常有帮助的链接:Classification of Variables in Parfor。当MATLAB不能将变量分类到它在该页面上概述的严格定义中时,这些问题就会出现。

这里发生的事情是,它不知道如何在循环之前对“切片变量”A进行切片。考虑一下自己编写并行实现。你想要做的是把A分割成一些你知道其他处理器不会碰的碎片,然后把它们分配给不同的CPU,让它们独立运行。MATLAB看着你的循环,不知道怎么做,因为它不知道j是什么,直到它运行程序。这是MATLAB的局限性。另一种情况是,如果使用复系数A(i*j,:),也会发生同样的事情。再一次,它不知道如何分割它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15578100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档