से मिलता है क्या bsxfun
जैसे तत्व-वार ऑपरेशंस करने का कोई तरीका है, लेकिन केवल स्पैर मैट्रिक्स के गैर-शून्य तत्वों पर काम करता है?जहां spfun bsxfun
विशेष रूप से, स्थिति (i,j)
पर मैट्रिक्स A
में प्रत्येक गैर शून्य तत्व के लिए मैं, i
वें पंक्ति में गैर शून्य के सभी तत्वों के उत्पाद को खोजने की तत्व (i,j)
के अलावा चाहते हैं।
उदाहरण के लिए i-th
पंक्ति इस तरह दिखता है:
0 5 3 0 0 4 0 0
परिणाम इस तरह दिखना चाहिए:
0 12 20 0 0 15 0 0
सबसे स्पष्ट समाधान गैर का उत्पाद लेने के लिए होने लगते हैं प्रत्येक पंक्ति के साथ शून्य तत्व, और फिर प्रत्येक तत्व को पंक्ति उत्पाद से बाहर विभाजित करें। इसलिए, उपर्युक्त उदाहरण में, पंक्ति उत्पाद 5 x 3 x 4 = 60
है, और फिर मैं अपने संबंधित स्थानों पर 5
3
और 4
को विभाजित करता हूं।
एक विरल मैट्रिक्स A
को देखते हुए, यह मेरा सबसे अच्छा समाधान अब तक है:
[M N] = size(A);
[row col vals] = find(A);
row_prod = accumarray(row,vals,[],@prod);
B = bsxfun(@ldivide, A, row_prod);
B = sparse(row,col,B(sub2ind([M N],row,col)),M,N);
पहली तीन पंक्तियों को प्राप्त जो मैं चाहता: एक स्तंभ वेक्टर प्रत्येक पंक्ति के गैर शून्य तत्वों के उत्पाद का प्रतिनिधित्व। हालांकि, पिछले दो लाइनों के साथ कुछ समस्याएं हैं।
bsxfun
एक गैर विरल मैट्रिक्स के A
Inf
या -Inf
शामिल हैं जहां मैं वास्तव में शून्य चाहता हूं।Inf
एस को मास्क नहीं कर सकता क्योंकि मैटलैब शून्य समय अनंतता को NaN
होने के लिए परिभाषित करता है।क्या मुझे सिर्फ बुलेट काटने और इसके लिए एक लूप लिखने की आवश्यकता है? या यह दृष्टिकोण करने का एक और तरीका है?