إنشاء (والوصول إلى) مصفوفة متفرقة مع إدخالات NA الافتراضية

StackOverflow https://stackoverflow.com/questions/1274171

سؤال

بعد التعلم عن خيارات للعمل مع مصفوفات متفرقة في ص, أريد أن أستخدم مصفوفة حزمة لإنشاء مصفوفة متفرقة من إطار البيانات التالي ولدي كل العناصر الأخرى NA.

     s    r d
1 1089 3772 1
2 1109  190 1
3 1109 2460 1
4 1109 3071 2
5 1109 3618 1
6 1109   38 7

أعلم أنني أستطيع إنشاء مصفوفة متناثرة مع ما يلي، والوصول إلى عناصر كالمعتاد:

> library(Matrix)
> Y <- sparseMatrix(s,r,x=d)
> Y[1089,3772]
[1] 1
> Y[1,1]
[1] 0

ولكن إذا كنت ترغب في الحصول على القيمة الافتراضية لتكون NA، جربت ما يلي:

  M <- Matrix(NA,max(s),max(r),sparse=TRUE)
  for (i in 1:nrow(X))
    M[s[i],r[i]] <- d[i]

وحصلت على هذا الخطأ

Error in checkSlotAssignment(object, name, value) : 
  assignment of an object of class "numeric" is not valid for slot "x" in an object of class "lgCMatrix"; is(value, "logical") is not TRUE

ليس ذلك فحسب، أجد أن المرء يستغرق الوصول إلى العناصر.

> system.time(Y[3,3])
   user  system elapsed 
  0.000   0.000   0.003 
> system.time(M[3,3])
   user  system elapsed 
  0.660   0.032   0.995 

كيف يجب أن أقوم بإنشاء هذه المصفوفة؟ لماذا مصفوفة واحدة أبطأ كثيرا للعمل معها؟

إليك مقتطف التعليمات البرمجية للبيانات أعلاه:

X <- structure(list(s = c(1089, 1109, 1109, 1109, 1109, 1109), r = c(3772, 
190, 2460, 3071, 3618, 38), d = c(1, 1, 1, 2, 1, 7)), .Names = c("s", 
"r", "d"), row.names = c(NA, 6L), class = "data.frame")
هل كانت مفيدة؟

المحلول

نعم، جواب تييري صحيح بالتأكيد أستطيع أن أقول مؤلفة مشتركة لحزمة "مصفوفة" ...

لسؤالك الآخر: لماذا الوصول إلى "M" أبطأ من "y"؟ الجواب الرئيسي هو أن "M" هو أكثر من ذلك بكثير sparser أكثر من "Y" وبالتالي أكثر أصغر بكثير و - اعتمادا على الأحجام المذدنة وذاكرة الوصول العشوائي الخاصة بك - وقت الوصول أسرع لكائنات أصغر بكثير، لا سيما للفهرسة فيها وبعد

نصائح أخرى

لماذا تريد قيم NA الافتراضية؟ بقدر ما أعرف المصفوفات متناثرة فقط إذا كانت لديهم خلايا صفرية. كما NA هي قيمة غير صفرية، فإنك تفقد كل الفوائد من مصفوفة متفرق. مصفوفة كلاسيكية أكثر كفاءة إذا كان المصفوفة بالكاد أي الأصفار. مصفوفة كلاسيكية مثل ناقلات سيتم قطعه وفقا للأبعاد. لذلك يتعين عليه تخزين ناقلات البيانات والأبعاد. يخزن مصفوفة Sparse فقط القيم غير الصفرية، ولكن أيضا مخازن هناك. هذه ميزة إذا ولتوجه فقط إذا كان لديك قيم صفرية كافية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top