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?
댓글 수: 0
채택된 답변
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
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))
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Structures에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!