You are assuming that R is using row-major order
for recycling elements, when in fact it is using column-
major order.

It doesn't show up in the first case, because all the
elements of x are identical

> x <- c(1,1,1)
> matrix(x, nrow=2, ncol=3)
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
> x <- c(1,1,2)
> matrix(x, nrow=2, ncol=3)
     [,1] [,2] [,3]
[1,]    1    2    1
[2,]    1    1    2

Here's one possible fix. But note that the guts of dist() are
implemented in C, so it will be faster than your solution for
large matrices, regardless of the extra calculations.
(And just to be picky, dist() returns an object of class dist.)

> norm <- function(x, y) {
+ x <- matrix(x, nrow=nrow(y), ncol=ncol(y), byrow=TRUE)
+ sqrt( rowSums( (x-y)^2 ) )
+ }
>
>
> y <- matrix(
+      c(  1,1,1,
+           2,3,4), nrow=2, byrow=TRUE)
> x <- c(1,1,1)
> norm(x, y)
[1] 0.000000 3.741657
>
> y <- matrix( c(1,1,2,1,2,2), nrow=2, byrow=TRUE )
> x <- c(1,1,2)
> norm(x,y)
[1] 0 1
>
>

Sarah


On Sat, Nov 13, 2010 at 9:17 AM, Alexx Hardt <mikrowelle1...@gmx.de> wrote:
> Am 13.11.2010 14:39, schrieb Sarah Goslee:
>>
>> I at least would need to see an actual example of your code to
>> be able to answer your question.
>>
>
> My function:
>
> norm <- function(x,y){
>  sqrt( rowSums( (x-y)^2 ) )
> }
>
> y <- matrix(
>      c(  1,1,1,
>           2,3,4), nrow=2, byrow=TRUE)
> x <- c(1,1,1)
>
> Here, norm(x,y) does work. But here:
>
> y <- matrix( c(1,1,2,1,2,2), nrow=2, byrow=TRUE )
> x <- c(1,1,2)
> norm(x,y)
>
> it produces weird numbers:
>
> [1] 1.414214 1.00000
>
> which is sqrt(2) and 1. I have no idea what gets mixed up here :-(
>
>> But why not just use dist() and take the appropriate column of the
>> resultant matrix?
>>
>> mydist<- function(x, amat) {
>> # x is the single variable as a vector
>> # amat is the remaining variables as rows
>> alldist<- dist(rbind(x, amat))
>> as.matrix(alldist)[-1,1]
>> }
>>
>
> dist returned a vector for me, and I didn't know how to extract the proper
> elements.
> Also, I'm kind of OCD about wasted computations, which would be the
> distances between elements of y :-)
>
> Thanks,
>  Alex
>

-- 
Sarah Goslee
http://www.functionaldiversity.org

______________________________________________
R-help@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.

Reply via email to