フィルターのクリア

How do I use 'ErrorHandler' in arrayfun?

2 ビュー (過去 30 日間)
Michael
Michael 2014 年 1 月 15 日
コメント済み: Michael 2014 年 1 月 25 日
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 Center および File ExchangeRaspberry Pi Hardware についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by