Index exceeds matrix dimensions using sprintf by calling mat files
4 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Amira Rodenburg
el 11 de Sept. de 2018
Respondida: Amira Rodenburg
el 11 de Sept. de 2018
Can someone help me with the following error?
Index exceeds matrix dimensions.
Error in Lateral_Position (line 28)
eval(sprintf('x=[TP%d_BaseLine(:,2)]',i));
_________________________________________________________________
%%Load Data
filenames = {'TP2_BL.mat','TP3_BL.mat','TP4_BL.mat','TP5_BL.mat','TP6_BL.mat','TP7_BL.mat','TP8_BL.mat','TP9_BL.mat','TP10_BL.mat','TP11_BL.mat','TP12_BL.mat','TP13_BL.mat','TP14_BL.mat','TP15_BL.mat','TP16_BL.mat','TP17_BL.mat','TP18_BL.mat','TP19_BL.mat'};
for kk = 1:numel(filenames)
load(filenames{kk})
end
disp('Cell data BL loaded')
disp('-------------------------------------------------------------------')
Ldist=[];
for i=2:19
eval(sprintf('x=[TP%d_BaseLine(:,2)]',i));
Ldist=[Ldist;x];
end
Rdist=[];
for i=2:19
eval(sprintf('x=[TP%d_BaseLine(:,4)]',i));
Rdist=[Rdist;x];
end
2 comentarios
Rik
el 11 de Sept. de 2018
I suspect Stephen is now typing a longer comment with the same message, so I'll keep it short: help yourself and don't use numbered variables or eval. It makes your code really difficult to debug (or understand). Usually a cell array or a struct is a much better idea.
Stephen23
el 11 de Sept. de 2018
Editada: Stephen23
el 11 de Sept. de 2018
Do NOT use eval like that. Magically accessing variable names is one way that beginners force themselves into writing slow, complex, buggy code that is hard to debug. Read this to know why:
@Rik Wisselink: thank you for your comment. I really appreciate not being the only one who comments on these things, so please don't feel any need to keep them short!
Respuesta aceptada
Stephen23
el 11 de Sept. de 2018
Editada: Stephen23
el 11 de Sept. de 2018
Two important changes to make:
- Do NOT use eval.
- load into an output variable.
If you had named the variables inside each .mat file with exactly the same names then your processing would be much simpler too: in contrast to what some beginners think, it is much simpler to process a sequence of .mat files if they contain exactly the same variable names.
How to improve your code depends on how many variables there are in each .mat file, and what their names are: you have not told us this, which makes it harder to help you. Assuming that each .mat file contains one variable then you can easily do something like this (untested as I don't have any sample files):
F = {'TP2_BL.mat','TP3_BL.mat','TP4_BL.mat','TP5_BL.mat','TP6_BL.mat','TP7_BL.mat','TP8_BL.mat','TP9_BL.mat','TP10_BL.mat','TP11_BL.mat','TP12_BL.mat','TP13_BL.mat','TP14_BL.mat','TP15_BL.mat','TP16_BL.mat','TP17_BL.mat','TP18_BL.mat','TP19_BL.mat'};
%S = dir('TP*_BL.mat'); % why not just use DIR ?
%F = natsortfiles({S.name}); % download from File Exchange.
C = cell(size(F));
for kk = 1:numel(F)
S = load(F{kk});
C(kk) = struct2cell(S);
end
M = vertcat(C{:});
Ldist = M(:,2);
Rdist = M(:,4);
If there are multiple variables in each .mat file, then you can select which one to import by using the regular expression syntax.
0 comentarios
Más respuestas (1)
Ver también
Categorías
Más información sobre Matrix Indexing en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!