आप वास्तव में सरल आव्यूह गुणन के साथ इस का समाधान कर सकते हैं: ऊपर के उदाहरण में बदल देना चाहिए।
result = M * (1:size(M, 2)).';
3
1
2
1
3
यह एक 3 एक्स 1 सरणी जहां 3x1 के तत्वों बस रहे हैं [1; 2; 3]
के साथ अपने एम एक्स 3 मैट्रिक्स गुणा करके काम करता है। संक्षेप में, M
की प्रत्येक पंक्ति के लिए, तत्व-वार गुणा 3 x 1 सरणी के साथ किया जाता है। केवल M
की पंक्ति में 1 परिणाम परिणाम में कुछ भी प्रदान करेगा। फिर इस तत्व-वार गुणा के परिणाम का सारांश दिया जाता है। क्योंकि आपके पास प्रति पंक्ति केवल एक "1" है, परिणाम कॉलम इंडेक्स होने जा रहा है जहां वह 1 स्थित है।
तो उदाहरण के लिए M
की पहली पंक्ति के लिए।
element_wise_multiplication = [0 0 1] .* [1 2 3]
[0, 0, 3]
sum(element_wise_multiplication)
3
अद्यतन
@reyryeng और नीचे @Luis द्वारा प्रदान समाधान के आधार पर, मैं एक तुलना चलाने के लिए कैसे विभिन्न तरीकों के प्रदर्शन की तुलना में देखने का फैसला किया।
परीक्षण मैट्रिक्स (M
) सेट अप करने के लिए मैंने मूल प्रश्न में निर्दिष्ट फॉर्म का एक मैट्रिक्स बनाया और पंक्तियों की संख्या को अलग किया। किस कॉलम कोका उपयोग करके यादृच्छिक रूप से चुना गया था। निष्पादन के समय का विश्लेषण का उपयोग करके किया गया था।
double
(MATLAB के डिफ़ॉल्ट) के प्रकार का उपयोग करते समय चलाते समय आपको निम्नलिखित निष्पादन समय मिलते हैं।
तो M
एक logical
है, तो आव्यूह गुणन तथ्य यह है कि यह एक संख्यात्मक प्रकार गुणा मैट्रिक्स से पहले करने के लिए परिवर्तित किया गया है अन्य दो एक का एक सा है, जबकि की वजह से एक हिट लेता है प्रदर्शन में सुधार।
यहाँ परीक्षण कोड है कि मैं का इस्तेमाल किया है।
sizes = round(linspace(100, 100000, 100));
times = zeros(numel(sizes), 3);
for k = 1:numel(sizes)
M = generateM(sizes(k));
times(k,1) = timeit(@()M * (1:size(M, 2)).');
M = generateM(sizes(k));
times(k,2) = timeit(@()max(M, [], 2), 2);
M = generateM(sizes(k));
times(k,3) = timeit(@()find(M.'), 2);
end
figure
plot(range, times/1000);
legend({'Multiplication', 'Max', 'Find'})
xlabel('Number of rows in M')
ylabel('Execution Time (ms)')
function M = generateM(nRows)
M = zeros(nRows, 3);
col = randi([1 size(M, 2)], 1, size(M, 1));
M(sub2ind(size(M), 1:numel(col), col)) = 1;
end
आपके बहुत तेज़ उत्तर के लिए बहुत बहुत धन्यवाद। ये बिलकुल सही है। – machinery