我试图将错误保存在单元格内部的嵌套parfor循环中,但不幸的是我没有成功。除了这部分之外,代码的所有部分都可以正常工作:err_list{l1}(l2)={mean(tmp) [lambda1_list(l1),lambda2_list(l2)]};
有人会帮我解决这个问题吗?
err_list = cell(length(lambda1_list),length(lambda2_list));
parfor l1 = 1:length(lambda1_list) % over l1
this_param = params;
% Create this to save CV error:
tmp=zeros(params.nfolds,1);
for l2 = 1:length(lambda2_list)
this_param.lambda1 = lambda1_list(l1);
this_param.lambda2 = lambda2_list(l2);
% Get Nth fold training and test data and compute CV error
for Fold=1:size(Fold_indices,2)
Y_train=y_train(logical(Fold_indices(:,Fold)),1:end);
Y_test=y_train(~logical(Fold_indices(:,Fold)),1:end);
N=size(Y_test,1);
Dictionary_train=dictionary_train(logical(Fold_indices(:,Fold)),1:end);
Dictionary_test=dictionary_train(~logical(Fold_indices(:,Fold)),1:end);
[totBeta,theta,omega,rho,nu] = learn(Dictionary_train,Y_train, this_param);
err = (1/N) * sum(sum(( Y_test- Dictionary_test * totBeta).^2));
tmp(Fold,1)=err;
end
err_list{l1}(l2)={mean(tmp) [lambda1_list(l1),lambda2_list(l2)]};
end
end %
The error I get is :
***Subscripted assignment dimension mismatch.***
and it's belong t
o这部分代码:
err_list{l1}(l2)={mean(tmp) [lambda1_list(l1),lambda2_list(l2)]};
答案 0 :(得分:1)
这是更新后的代码
err_list = cell(1,length(lambda1_list));
parfor l1 = 1:length(lambda1_list) % over l1
this_param = params;
this_l1=l1;
% Create this to save CV error:
tmp=zeros(params.nfolds,1);
err_list_temp = cell(1,length(lambda2_list));
for l2 = 1:length(lambda2_list)
this_param.lambda1 = lambda1_list(l1);
this_param.lambda2 = lambda2_list(l2);
% Get Nth fold training and test data and compute CV error
for Fold=1:size(Fold_indices,2)
Y_train=y_train(logical(Fold_indices(:,Fold)),1:end);
Y_test=y_train(~logical(Fold_indices(:,Fold)),1:end);
N=size(Y_test,1);
Dictionary_train=dictionary_train(logical(Fold_indices(:,Fold)),1:end);
Dictionary_test=dictionary_train(~logical(Fold_indices(:,Fold)),1:end);
[totBeta,theta,omega,rho,nu] = learn(Dictionary_train,Y_train, this_param);
err = (1/N) * sum(sum(( Y_test- Dictionary_test * totBeta).^2));
tmp(Fold,1)=err;
end
tmpMean=mean(tmp);
err_list_temp{l2}={tmpMean [lambda1_list(this_l1),lambda2_list(l2)]};
end
err_list{l1}=err_list_temp;
end %
答案 1 :(得分:0)
2D单元格被编入索引err_list{l1,l2}
而不是err_list{l1}(l2)
,这将索引您想要的内容,但不允许在parfor循环内。要解决此问题,您必须获取属于parfor循环的每个索引的切片,使用它并将其写回。
err_list = cell(length(lambda1_list),length(lambda2_list));
parfor l1 = 1:length(lambda1_list) % over l1
slice_err_list=err_list(l1,:);
%irrelevant code removed
for l2 = 1:length(lambda2_list)
%irrelevant code removed
slice_err_list{l2}={[lambda1_list(l1),lambda2_list(l2)]};
end
err_list(l1,:)=slice_err_list;
end %