Question

Say I have a vector of independent variable values

v =[ 1 2 2 1 1 .5 1 2 .5 .5 1]

and a vector of response variables

u = [ 5 22 20 4 8 .2 5 12 0 .5 6]

I want to plot u vs. v with errorbars, the method needs to work for 100s of possible values for the independent variable. The problem isn't in plotting the error bars, it's in how can I create a vector pair [mean(u(find(v==0.5)), mean(u(find(v==1)), mean(u(find(v==2))]. Is there a standard automated way of doing this other than sorting v, then picking out the values of sorted v and finding the index of v where v matches those values? This seems very inefficient.

Was it helpful?

Solution

This might be what you are after if you want to get the means for each unique value of v in the order in which the unique values appear in v:

>> [unv,iunv,iv] = unique(v);
>> umeans = accumarray(iv(:),u,[],@mean);
>> [~,ivorder] = sort(iunv);
>> umeans = umeans(ivorder)

umeans =

    5.6000
   18.0000
    0.2333

If you want the means in order of the sorted values of v, then just use the output of accumarray without the reordering commands:

>> [unv,iunv,iv] = unique(v);
>> umeans = accumarray(iv(:),u,[],@mean)

umeans =

    0.2333
    5.6000
   18.0000

Just ensure that u is a row vector.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top