如何在Matlab的嵌套parfool循环中保存单元格内部?

时间:2016-05-17 08:23:18

标签: matlab

我试图将错误保存在单元格内部的嵌套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)]};

2 个答案:

答案 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 %