How do I use 'ErrorHandler' in arrayfun?

3 次查看(过去 30 天)
x = arrayfun(@(x) mean(x.Num(1:20,3)), Struct, 'UniformOutput', false)
Struct is a 1x45 structure containing a field called Num, which is an array of integers.
I want to take the mean of the first 20 numbers in the third column pf each of the 45 Num fields, but the problem is that a few of the Num fields have fewer than 20 rows. So when I try to run this, Matlab gives me an error saying "Index exceeds matrix dimensions"
How can I use the ErrorHandler to make the mean = 0 when Num has fewer than 20 numbers in the third column?

采纳的回答

Jacob Halbrooks
Jacob Halbrooks 2014-1-15
Rather than use ErrorHandler here, consider writing your logic into a function that acts on a scalar struct. This function would check the input struct's Num field size to determine whether to return a mean calculation or 0. Here is an example:
function v = meanMyStruct(s)
sNum = s.Num;
if size(sNum,1) >= 20
v = mean(sNum(1:20,3));
else
v = 0;
end
Now you can use this function with ARRAYFUN on your struct array:
s = struct('Num',{rand(20,5), rand(19,5), rand(21,5)});
out = arrayfun(@meanMyStruct, s)
  3 个评论
Jacob Halbrooks
Jacob Halbrooks 2014-1-16
Using the first data as an example:
sNum = [1 2 4; 17 4 6; 19 9 8; 25 10 18];
You can then get just the first column and create a logical mask of the rows that fit your condition:
firstColumn = sNum(:,1);
rowsUnder20 = firstColumn <20;
Now you can use the logical mask to select just the data you want:
sNumNew = sNum(rowsUnder20,:);
disp(sNumNew)
1 2 4
17 4 6
19 9 8
So now just take the mean of the third row of sNumNew:
mean(sNumNew(:,3))
Michael
Michael 2014-1-25
thank you very much, that works perfectly.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Structures 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by