大小输入必须是标量

时间:2017-04-27 08:09:31

标签: matlab

有人可以解释我如何解决错误"尺寸输入必须是标量"?当我在matlab中运行代码时,它可以正常工作,但是当我运行编译的exe时,我得到了这个错误:

  

使用randperm时出错

     

大小输入必须是标量。

     

randsample中的错误(第162行)

     

mycode'错误(线   。' indexesWith0 = randsample(1:N-sumboo,nToAnalyze-sumboo); %' ..)

     

MATLAB:NonScalarInput

nToAnalyze=options.nToAnalyze;
if isempty(nToAnalyze) 
    Exclude='';
else
    if nToAnalyze >n
        error(['nToAnalyze must be smaller or equal than ' num2str(n)])
    end
    boo=double_y ==1; %  
    notboo=~boo; %  
    sumboo=sum(boo); %  
    seq=1:n;  %  

      indToExtractWith0=seq(notboo); % indexes of units which have 0
      indexesWith0=randsample(1:n-sumboo,nToAnalyze-sumboo); % 
      UnitsToAnalyzeWith0=indToExtractWith0(indexesWith0); %  
      UnitsToanalyze=[seq(boo) UnitsToAnalyzeWith0]; %  
      Exclude=setdiff(seq,UnitsToanalyze); %  
end

谢谢

1 个答案:

答案 0 :(得分:0)

根据MATLAB help,有两种方法可以使用randsample和两个输入参数:

  

y = randsample(n,k)返回采样值的k-by-1向量y   从整数1到n均匀随机地,无需替换。

     

y = randsample(population,k)返回采样的k值向量   统一随机,无需替换,从中的值   矢量人口。 y(行或列)的方向与   人口。

因此,为第一个参数n提供矢量是合法的,但不能为第二个参数k提供矢量。

如果您查看randsample函数(类型edit randsample)并转到第162行,您可以看到实际抛出此错误的命令是

y = y(randperm(k));

其中krandsample的第二个参数。所以看起来好像在某种程度上,当你运行已编译的代码时,你最终会得到一个nToAnalyze-sumboo的值,它是一个向量而不是一个标量,你只是在测试你的时候没有复制这个案例。编辑器中的代码。

如果options.nToAnalyze是向量,则可能发生这种情况;如果double_y是矩阵(维度2或更高),也会发生这种情况,因为boo将具有相同的维度,sum(boo)将减少一个维度。检查代码的其余部分,找出其中任何一个可能发生的位置。