【发布时间】:2015-11-06 21:36:29
【问题描述】:
我收到以下错误:“parfor 中的变量 X_bs 不能 分类”尝试运行以下 parfor 循环时:
y = zeros(1000,1)
parfor bb = 1:1000
rng(bb)
% deleted line: X_bs{8} = [];
for ii = 1:8
ind = ceil(N(ii)*rand(N(ii),1));
X_bs{ii} = X{ii}(ind,:);
end
y(bb) = another_function(X_bs)
end
X 是一个 1x8 元胞数组,每个元胞包含一个 N(ii)x4 矩阵(N(ii) 变化)。代码重新采样X 的行并创建一个名为X_bs 的元胞数组。我通过一个函数传递X_bs,该函数输出我感兴趣的变量y(bb)。
为什么会出现此错误?我该如何解决这个问题?
这是一个例子:
X{1} = [1 ; 2 ; 3]
X{2} = [4 ; 5 ; 6; 7]
N(1) = 3 % size of X{1}
N(2) = 4 % size of X{2}
parfor bb=1:10
rng(bb)
for ii = 1:2
X_bs{ii} = zeros(N(ii),1);
ind = ceil(N(ii)*rand(N(ii),1));
X_bs{ii} = X{ii}(ind,:);
end
% Output is a function of X_bs. For illustration, say it is the sum
y(bb) = sum(X_bs{1}) + sum(X_bs{2});
end
上面的代码得到了与前面相同的错误:“parfor 中的变量 X_bs 无法分类”。这是一个更简单的版本,它可以工作并且不使用单元结构:
X = [1 ; 2 ; 3]
N = 3; %size of X
parfor bb=1:10
rng(bb)
X_bs = zeros(N,1);
ind = ceil(N*rand(N,1));
X_bs= X(ind,:);
y(bb) = sum(X_bs)
end
问题(我认为)在于覆盖单元结构。也许 parfor 将单元结构视为切片变量而不是临时变量。有什么想法吗?
更新:Adriaan 提示随机向量ind 和细胞结构X_bs{ii} 存在问题。这是一个更简单的示例,它不调用随机向量 ind 并且仍然有相同的错误:
X{1} = [1 ; 2 ; 3]
X{2} = [4 ; 5 ; 6; 7]
N(1) = 3 % size of X{1}
N(2) = 4 % size of X{2}
parfor bb=1:10
for ii = 1:2
X_bs{ii} = X{ii};
end
% Output is a function of X_bs. For illustration, say it is the sum
y(bb) = sum(X_bs{1}) + sum(X_bs{2});
end
因此,我相当肯定 MatLab 没有将单元结构 X_bs{ii} 视为临时变量。
【问题讨论】:
-
我编辑了 share_bs 并将其更改为 X_bs 以避免混淆。 X_bs 应该是一个临时变量。删除行 X_bs{8} = []; 后我仍然收到错误