Index exceeds matrix dimensions using sprintf by calling mat files
2 ビュー (過去 30 日間)
古いコメントを表示
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 件のコメント
Rik
2018 年 9 月 11 日
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
2018 年 9 月 11 日
編集済み: Stephen23
2018 年 9 月 11 日
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!
採用された回答
Stephen23
2018 年 9 月 11 日
編集済み: Stephen23
2018 年 9 月 11 日
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 件のコメント
その他の回答 (1 件)
参考
カテゴリ
Help Center および File Exchange で Matrix Indexing についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!