How to sample single values from field in *non-scalar structure array*?
Show older comments
Hello Matlab experts,
I'm working on the optimization of some code following the Profiler's measurements.
Here, one main bottleneck is the sampling of an individual element on each of the fields contained within the struct array.
For context, let's consider that a non-scalar struct array with uniform mat sparse fields is built as
A = repmat(struct('mat',speye(3)),10,1);
for k = 1:10
A(k).mat = A(k).mat * k;
end
For the sake of simplicity, I'm interested in sampling each field at indexes (i,j) = (2,2) as
col = zeros(10,1);
for k = 1:10
col(k) = A(k).mat(2,2);
end
So that for the next step, I report each sampled point into a column vector.
Thus the expected output is:
>> col
col =
1
2
3
4
5
6
7
8
9
10
Question: is there a much better (hopefully faster) way to do this? (mainly getting rid of the for-loop)
Disclaimer: I have tried converting this struct array into flat array, [A.mat], or into an array of cells, {A.mat}, but I run into the trouble of the sparse nature of the fields (Get warnings with SPFUN). I'm sure there must be a clever way to do this with arrayfun() or cellfun() but the solution eludes me.
8 Comments
Stephen23
on 25 Jul 2023
"I'm sure there must be a clever way to do this with arrayfun() or cellfun() but the solution eludes me."
Both are likely to be slower than a well-written loop.
Manuel A. Diaz
on 25 Jul 2023
Edited: Manuel A. Diaz
on 25 Jul 2023
Manuel A. Diaz
on 25 Jul 2023
Stephen23
on 25 Jul 2023
"Not sure I get you."
This is one array:
A = rand(2,3);
here is some indexing into it:
A(1,3)
In general a comma-separated list in not one array. Therefor it cannot be indexed into like you showed.
Manuel A. Diaz
on 25 Jul 2023
Edited: Manuel A. Diaz
on 25 Jul 2023
Bruno Luong
on 26 Jul 2023
Edited: Bruno Luong
on 26 Jul 2023
You might take a look at this FEX by @Matt J
Manuel A. Diaz
on 26 Jul 2023
Accepted Answer
More Answers (1)
Bruno Luong
on 25 Jul 2023
Edited: Bruno Luong
on 25 Jul 2023
Just shorter code, not necessary better.
A = repmat(struct('mat',speye(3)),10,1);
for k = 1:10
A(k).mat = A(k).mat * k;
end
col = arrayfun(@(s) full(s.mat(2,2)), A)
1 Comment
Manuel A. Diaz
on 25 Jul 2023
Categories
Find more on Matrices and Arrays 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!

