मैं अभी यही कर रहा हूँ

library(Rcpp)

A <- diag(c(1.0, 2.0, 3.0))
rownames(A) <- c('X', 'Y', 'Z')
colnames(A) <- c('A', 'B', 'C')

cppFunction('
void scaleMatrix(NumericMatrix& A, double x) {
    A = A * x;
}')

दुर्भाग्य से यह काम नहीं करता :(

> A
  A B C
X 1 0 0
Y 0 2 0
Z 0 0 3
> scaleMatrix(A, 2)
> A
  A B C
X 1 0 0
Y 0 2 0
Z 0 0 3

मैंने Rcpp FAQ, Question 5.1 से सीखा कि आरसीपीपी उस वस्तु को बदलने में सक्षम होना चाहिए जिसे मैंने मूल्य से पारित किया था। मेरे पिछले प्रश्न के लिए Dirk's answer से एक उदाहरण चुराना:

> library(Rcpp)
> cppFunction("void inplaceMod(NumericVector x) { x = x * 2; }")
> x <- as.numeric(1:5)
> inplaceMod(x)
> x
[1]  2  4  6  8 10

मैं उलझन में हूं: NumericVector को इन-प्लेस संशोधित करना संभव है, लेकिन NumericMatrix को नहीं?

2
nalzok 6 सितंबर 2019, 11:06

1 उत्तर

सबसे बढ़िया उत्तर

आप NumericMatrix के बजाय NumericVector का उपयोग करके पंक्ति और स्तंभ नामों को संरक्षित कर सकते हैं, यह ध्यान में रखते हुए कि R में एक मैट्रिक्स संलग्न आयामों के साथ सिर्फ एक वेक्टर है। आप यह स्विच या तो R से C++ (scaleVector नीचे) या C++ (scaleMatrix नीचे @Roland द्वारा अब हटाए गए उत्तर से लिया गया) में जाने पर कर सकते हैं:

library(Rcpp)
cppFunction('
NumericVector scaleVector(NumericVector& A, double x) {
    A = A * x;
    return A;
}')

cppFunction('
NumericMatrix scaleMatrix(NumericMatrix& A, double x) {
    NumericVector B = A;
    B = B * x;
    return A;
}')

यदि कोई इन दो कार्यों को आपके मैट्रिक्स पर लागू करता है, तो पंक्ति और स्तंभ नाम संरक्षित होते हैं। हालांकि, मैट्रिक्स जगह में नहीं बदला है:

A <- diag(1:3)
rownames(A) <- c('X', 'Y', 'Z')
colnames(A) <- c('A', 'B', 'C')

scaleMatrix(A, 2)
#>   A B C
#> X 2 0 0
#> Y 0 4 0
#> Z 0 0 6
scaleVector(A, 2)
#>   A B C
#> X 2 0 0
#> Y 0 4 0
#> Z 0 0 6
A
#>   A B C
#> X 1 0 0
#> Y 0 2 0
#> Z 0 0 3

इसका कारण यह है कि diag(1:3) वास्तव में एक पूर्णांक मैट्रिक्स है, इसलिए जब आप इसे संख्यात्मक मैट्रिक्स (या वेक्टर) में स्थानांतरित करते हैं तो एक प्रतिलिपि बनाई जाती है:

is.integer(A)
#> [1] TRUE

यदि कोई शुरू करने के लिए एक संख्यात्मक मैट्रिक्स का उपयोग करता है, तो संशोधन किया जाता है:

A <- diag(c(1.0, 2.0, 3.0))
rownames(A) <- c('X', 'Y', 'Z')
colnames(A) <- c('A', 'B', 'C')

scaleMatrix(A, 2)
#>   A B C
#> X 2 0 0
#> Y 0 4 0
#> Z 0 0 6
scaleVector(A, 2)
#>   A B  C
#> X 4 0  0
#> Y 0 8  0
#> Z 0 0 12
A
#>   A B  C
#> X 4 0  0
#> Y 0 8  0
#> Z 0 0 12
6
Ralf Stubner 6 सितंबर 2019, 09:11