data import from mat file
Show older comments
I have a mat file named as xyz.mat, the mat file contains 10 variables named as a_1, a_2, a_3......a_10.
1. I want to develop a script that will load this mat file.
2. Load the variables and record their number 1 to 10 automatically.
3. since there are 10 variable (a_1 to a_10) , a function abc will be run 10 times, one time for each variable , the result after processing of each variable will be stored in varaibles R_1 to R_10. The script should be a generic one it will remain valid for even more than 10 variables.
2 Comments
Geoff Hayes
on 10 Aug 2020
jibs - what have you tried so far? Please give us an idea of what you have attempted. Also, strongly consider not using variables that are numbered and use an array (perhaps cell) instead to manage all of the data.
jibs
on 11 Aug 2020
Answers (1)
hosein Javan
on 10 Aug 2020
instead of a_1 ,a_2,..., define a vector "a" where its elements a(1), a(2), ... are your input argument. your function should look like this:
function R = abc(a)
% write your function
end
now for your script:
load('xyz.mat') % load input data a
R = abc(a) % call function abc and calculate R
save('Results.mat','R') % save R to the file Results.mat
8 Comments
jibs
on 11 Aug 2020
hosein Javan
on 11 Aug 2020
if you have saved all a_1, a_2 ,... in a mat file, once you load the file; all of them will be loaded and you don't need to load each of them one by one. as I said it's best to store all of them in one array but if you need to load them one by one, do a function to them one by one and store the results one by one, you could do sth like this:
abc = @(x) x^2; % function
n = 10; % number of i/o: a_1 , ... ,a_n
for it = 1:n
load('a.mat',sprintf('a_%d',it)) % load a_i
eval(sprintf('R_%d = %d',it,abc(eval(sprintf('a_%d',it))))) % R_i = abc(a_i)
end
str = sprintf('''R_%d'',',1:10); str(end)='';
str = ['save(''Results.mat'',',str,')'];
eval(str) % save('Results.mat','R_1',...'R_n')
again. this method is not recommended. use arrays if not using matrices.
jibs
on 11 Aug 2020
hosein Javan
on 11 Aug 2020
so I guess if you replace it with while loop, the job is done. is there any other problem that this code won't do?
jibs
on 11 Aug 2020
hosein Javan
on 11 Aug 2020
the only way to avoid size change in a loop is preallocation. before the loop add a "r=zeros(1,n)". and "n" must be known. it is weird that the number of inputs are unknown. how is it that you can't preallocate it? you can even ask the user to enter the number of inputs. if there is no way for preallocation, changing size on each iteration is not very bad, it is just a little slow.
jibs
on 11 Aug 2020
hosein Javan
on 11 Aug 2020
correct.
Categories
Find more on Loops and Conditional Statements in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!