2016-05-03 18 views
2

sagen, dass ich Teile mache, die in drei Größen, und jede Größe hat eine gewisse Toleranz:Multiplizieren jeder Komponente des Vektors durch einen anderen Vektor (was Vektor von m * n Länge)

target <- c(2, 4, 6) 
tolerance <- c(0.95, 1.05) 

Was ich d mag bis Ende mit einem Array, das für jedes Ziel (dh Ziel * 0,95, Ziel * 1,05) die Grenzen der Toleranz enthält:

tol = (2*0.95, 2*1.05, 4*0.95, 4*1.05, 6*0.95, 6*1.05) 

Hier ist eine wirklich hässliche Art und Weise dorthin zu gelangen, aber ich weiß, dass es ist eine einfache Möglichkeit, dies zu tun.

j<-1 
tol<-NULL 
for (i in target){ 
tol[j] <- i*tolerance[1] 
tol[j+1] <- i*tolerance[2] 
j<-j+2 
} 

Antwort

3

Der Vektor tol berechnet werden kann outer() wie folgt aus:

tol <- c(outer(tolerance,target)) 
#> tol 
#[1] 1.9 2.1 3.8 4.2 5.7 6.3 
+0

während "äußere" wäre nützlich für andere Funktionen neben dem Produkt, es ist erwähnenswert, dass alles, was es tut, ist einige zusätzliche Prüfungen und dann '% *%', wenn das 'FUN' Argument fehlt – eddi

+0

@eddi In mathematischen Begriffen, Ihr Kommentar ist falsch. Bitte lernen Sie die Unterschiede zwischen einem dyadischen (äußeren) Produkt und einer Matrixmultiplikation "% *%" kennen. Dies ist ein Ausnahmefall, bei dem das Matrixprodukt zum gleichen Ergebnis führt, nur weil die "Matrizen" den Rang (1, m) und (n, 1) * haben. Das Matrixprodukt% *% führt in diesem Fall unnötige Summierungen durch. Die vom OP beschriebene Situation ist ein Standardbeispiel für die Verwendung von äußerem Produkt oder "% o%" und nicht für "% *%". – RHertel

+0

Die Implementierung dieser verschiedenen Produkte in R ist eine andere Sache. Dort kann das Matrixprodukt auf die gleiche Weise behandelt werden, wenn Vektoren und nicht Matrizen als Eingabe verwendet werden. – RHertel

3

können Sie erreichen, dass die Verwendung von Matrixprodukt:

target <- c(2, 4, 6) 
tolerance <- c(0.95, 1.05) 
target %*% t(tolerance) 
    [,1] [,2] 
[1,] 1.9 2.1 
[2,] 3.8 4.2 
[3,] 5.7 6.3 
+0

Dies ist das, was ich will, aber ich wollte das Ergebnis in einem Vektor gespeichert. Ich übergebe den Vektor an 'geom_vline' in einem Facetten-Wrap-Plot, wo der data.frame, den ich übergeben werde,' data.frame (tol, rep (as.factor (target), each = 2)) 'ist der 3 Teilplots hat die obere und untere Toleranz. –

2

Die andere Antwort wäre meine Präferenz, aber diese Alternative könnte sich in einem bestimmten Kontext (mehr als zwei Vektoren) besser verallgemeinern

Reduce("*", expand.grid(list(tolerance, target))) 
0

Vor allem für Spaß - mit R-Recycling:

rep(target, each = length(tolerance)) * tolerance 
#[1] 1.9 2.1 3.8 4.2 5.7 6.3 
Verwandte Themen