我正在使用此代码在A(i).data
中查找不同值范围内的值的最大值。我正在做的是导入一个txt,手动输入不同范围的中心(ppmdata
),设置范围的极值(emax
和emin
),找到它们的索引(它们在数组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
答案 0 :(得分:0)
该错误告诉您尝试在变量外部进行索引。
因为这是发生错误的行:
Massimo=max(A(i).data(g(1,1):g(m3,1),2));
只有几个选项:
A
的元素少于i
size(g)
小于[m3 1]
size(A(i).data)
小于[g(m3,1) 2]
([89461 2])根据您的描述,我猜第三种情况是您的问题,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
您没有遇到某些值的问题的原因不是因为您使用了正确的命令,而是因为这些数字对您有利。