Load specific column from mat file
Show older comments
Hello, I got a mat file with a struct of different variables. Each variable got a 1X5 struct entry. MAT File:
a = [0 0 0 0 1]
b = [0 0 0 1 0]
c = [0 1 0 0 1]
My simulink model got different variants and each column of the matfile belongs to a variant. So I would like to load that mat file with only one column. Workspace:
a = 1
b = 0
c = 1
Is that possible? Greetings Lucas
Answers (2)
KSSV
on 20 Nov 2017
a = a(end) ;
b = b(end) ;
c = c(end) ;
Jan
on 20 Nov 2017
This is not possible in one command, but with a tiny function:
function [a,b,c] = LoadColumn(FileName, col)
Data = load(FileName);
a = Data.a(col);
b = Data.b(col);
c = Data.c(col);
end
This might look trivial - in fact, it is. Does it solve your needs? If not, what is the remaining problem?
4 Comments
Lucas Maiß
on 20 Nov 2017
Edited: Stephen23
on 20 Nov 2017
@Lucas Maiß: Your code is very inefficient, because of the conversion between numeric and string, and back again. You should really:
- load into a variable, as Jan Simon showed.
- Use dynamic field names instead of slow, inefficient and buggy eval:
Then you could easily avoid all of those pointless and slow conversions. Or as an alternative, here is a simpler solution using structfun:
>> a = [0 0 0 0 1];
>> b = [0 0 0 1 0];
>> c = [0 1 0 0 1];
>> save('test.mat','a','b','c')
>> S = load('test.mat');
>> T = structfun(@(v)v(end),S,'UniformOutput',0);
>> T.a
ans = 1
>> T.b
ans = 0
>> T.c
ans = 1
Lucas Maiß
on 20 Nov 2017
Jan
on 20 Nov 2017
@Lucas: @(v)v(end) is an anonymous function, which replies the last element of the input.
With a loop:
function S = LoadColumn(FileName, col)
S = load(FileName);
Field = fieldnames(S);
for iField = 1:numel(Field)
F = Field{iField};
S.(F) = S.(F)(end);
end
end
Categories
Find more on Matrix Indexing 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!