find(x)在特定范围内使用时返回错误的索引

时间:2013-11-04 13:39:07

标签: matlab indexing find

我正在使用此代码在A(i).data中查找不同值范围内的值的最大值。我正在做的是导入一个txt,手动输入不同范围的中心(ppmdata),设置范围的极值(emaxemin),找到它们的索引(它们在数组g)中收集,然后使用索引在A(i).data中找到值。

代码工作正常,直到我添加(减去)到emax(和emin)的数字等于或小于0.01。什么时候更大,matlab给我一个错误:

Error in ==> NMR at 27
        Massimo=max(A(i).data(g(1,1):g(m3,1),2));

打开g,我不是说元素g(m3,1)是完全超出规模而且甚至没有相应于A(i).data的值(如果我检查该索引我得到一个空单元格) 。如果我使用

 Massimo=max(A(i).data(g(1,1):g(m3-1,1),2));

效果很好。

 % % Call all txt file
    [filename, pathname] = uigetfile('*.txt','Select the Excel file:', 'MultiSelect','on');
    %% Import all file
    [m1,n1]=size(filename);
A(1:n1)=struct('data',zeros(),'textdata',zeros());
for i=1:n1
    nomefile= fullfile(pathname,filename{1,i});
    A(i)=importdata(nomefile);
end
%% ask which X values to monitor
prompt = {'Insert PPM values you want to monitor:'};
dlg_title = 'PPM';
num_lines = 1;
def = {'0.78,1.00,1.18'};
ppminput = inputdlg(prompt,dlg_title,num_lines,def);
ppmdata = str2num(ppminput{:});
%% Found the maxima for each X value in a range emin<X<emax
g=zeros();
[m2,n2]=size(ppmdata);
result=struct('data',zeros(),'name','', 'columnheading','');
for i=1:n1 % ciclo per mettere il nome
    for j=1:n2 %ciclo per mettere il dato
        emax=(ppmdata(1,j)+0.1;
        emin=(ppmdata(1,j)-0.1);
        g=find((A(i).data<emax) & (A(i).data>emin));
        [m3,n3]=size(g);
        Massimo=max(A(i).data(g(1,1):g(m3,1),2));
        if Massimo<0
            result.data(i,j)=0;
            result.columnheading{1,j}=['PPM:', ' ', num2str(ppmdata(1,j))];
        else
            result.data(i,j)=Massimo;
            result.columnheading{1,j}=['PPM:', ' ', num2str(ppmdata(1,j))];
        end
    end
    result.name{i,1}=A(i).textdata(19,1);
end
for i=1:n1
    for j=1:n2 %ciclo per mettere il dato
        result.data(i,n2+j)=((result.data(i,j)/sum(result.data(i,1:n2)))*100);
        result.columnheading{1,j+n2}=['Percentage:', ' ', num2str(ppmdata(1,j))];
    end

end

1 个答案:

答案 0 :(得分:0)

该错误告诉您尝试在变量外部进行索引。

因为这是发生错误的行:

Massimo=max(A(i).data(g(1,1):g(m3,1),2));

只有几个选项:

  1. A的元素少于i
  2. size(g)小于[m3 1]
  3. size(A(i).data)小于[g(m3,1) 2]([89461 2])
  4. 根据您的描述,我猜第三种情况是您的问题,A(i).data变量的长度小于89461。

    我的猜测是这行出了问题:

    g=find((A(i).data<emax) & (A(i).data>emin))
    

    也许您只想搜索A(i).data的第一列或第二列。如果这是你能做的第一件事:

    g=find((A(i).data(:,1)<emax) & (A(i).data(:,1)>emin))
    

    此问题的示例

    假设你有一个矩阵M

    M = [1 3; 5 7]
    

    如果你尝试找到这样的小值,它会顺利进行(巧合)

    find(M<2)  % Returns 1
    

    但是,如果您将阈值设置为第二列中的某个值,则会遇到麻烦:

    find(M<4)  % Returns 1 and 3
    

    您需要做的是:

    find(M(:,1)<4) % Returns 1
    

    您没有遇到某些值的问题的原因不是因为您使用了正确的命令,而是因为这些数字对您有利。