[R] effective matrix subset

jgarcia at ija.csic.es jgarcia at ija.csic.es
Sun Aug 10 11:23:16 CEST 2008


Patrick, you have misundertood me, I mean that Dan's solution (which is
also your solution) are both:
a) more clear and elegant
b) more time efficient. I've checked it with my working 10000*3000 element
matrixes. The improvement in speed with your solution is evident.

I do not advise at all to use my solution. At the contrary, you have
solved my problem.

Thanks, and regards.
Javier
----------


> That may be a better solution, but I don't think
> it is clearly a better solution.
>
> I presume you mean that your computation is the
> most time efficient.  That seems believable to me.
> It is not the most human efficient -- it will take
> some one reading the code non-trivial effort to
> understand it.
>
> Whether time or code clarity are more important
> depends on the particular application.
>
> Patrick Burns
> patrick at burns-stat.com
> +44 (0)20 8525 0696
> http://www.burns-stat.com
> (home of S Poetry and "A Guide for the Unwilling S User")
>
> jgarcia at ija.csic.es wrote:
>> It seems that this solution provided by Dan (and also available in
>> SPoetry; I'm sorry I didn't notice it) is the fastest and simplest. I
>> was
>> using a more standard approach:
>>
>> V <- t(A)[(0:(nrow(A)-1))*ncol(A)+X],
>>
>> That wasn't bad, but I was confident that you, R gurus, could outperform
>> this. This is clearly a much better solution.
>>
>> Thanks all, and best wishes,
>> Javier
>> ------
>>
>>
>>
>>
>>
>>> on 08/09/2008 06:52 AM Dan Davison wrote:
>>>
>>>> On Sat, Aug 09, 2008 at 06:29:59AM -0500, Marc Schwartz wrote:
>>>>
>>>>> on 08/09/2008 06:01 AM jgarcia at ija.csic.es wrote:
>>>>>
>>>>>> Hi;
>>>>>> If we have a matrix A, and a vector X, where length(X)=nrow(A), and
>>>>>> X
>>>>>> contains a wanted column for each row in A, in row ascending order.
>>>>>> How
>>>>>> would be the most effective way to extract the desired vector V
>>>>>> (with
>>>>>> length(V)=nrow(A))?
>>>>>>
>>>>> A <- matrix(1:20, 4, 5)
>>>>>
>>>>>
>>>>>> A
>>>>>>
>>>>>      [,1] [,2] [,3] [,4] [,5]
>>>>> [1,]    1    5    9   13   17
>>>>> [2,]    2    6   10   14   18
>>>>> [3,]    3    7   11   15   19
>>>>> [4,]    4    8   12   16   20
>>>>>
>>>>>
>>>>> # Create an arbitrary set of indices, one for each row in A
>>>>> X <- c(2, 5, 1, 4)
>>>>>
>>>>>
>>>>>> X
>>>>>>
>>>>> [1] 2 5 1 4
>>>>>
>>>>>
>>>>> Presumably you want:
>>>>>
>>>>> V <- c(A[1, 2], A[2, 5], A[3, 1], A[4, 4])
>>>>>
>>>>>
>>>>>> V
>>>>>>
>>>>> [1]  5 18  3 16
>>>>>
>>>>>
>>>>> If so, then:
>>>>>
>>>>>
>>>>>> sapply(seq(nrow(A)), function(i) A[i, X[i]])
>>>>>>
>>>>> [1]  5 18  3 16
>>>>>
>>>> Or
>>>>
>>>>
>>>>> A[cbind(seq(nrow(A)), X)]
>>>>>
>>>> [1]  5 18  3 16
>>>>
>>>> Dan
>>>>
>>> Better (and faster) solution Dan.
>>>
>>> I can't blame the lack of coffee on missing that one this morning. I
>>> have had a full pot already over the past 6 hours, working on shifting
>>> my internal clock and getting ready to begin my journey to Dortmund
>>> later tonight...
>>>
>>> Safe travels to all who are going.
>>>
>>> Marc
>>>
>>>
>>>
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>>
>>
>



More information about the R-help mailing list