gpt4 book ai didi

Matlab parfor 循环索引

转载 作者:太空宇宙 更新时间:2023-11-03 19:20:26 27 4
gpt4 key购买 nike

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

最佳答案

只是我的两分钱:正如@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;您可以使用 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 的实现之前,(不幸的是)在很多情况下都需要这样的解决方法。

关于Matlab parfor 循环索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15578100/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com