Bạn thực sự có thể giải quyết điều này bằng phép nhân ma trận đơn giản.
result = M * (1:size(M, 2)).';
3
1
2
1
3
Điều này hoạt động bằng cách nhân ma trận M x 3 với mảng 3 x 1 trong đó các phần tử của 3x1 chỉ đơn giản là [1; 2; 3]
. Tóm lại, đối với mỗi hàng của M
, phép nhân yếu tố được thực hiện với mảng 3 x 1. Chỉ 1 trong hàng M
sẽ mang lại kết quả. Sau đó, kết quả của phép nhân phần tử này được tổng kết. Bởi vì bạn chỉ có một "1" cho mỗi hàng, kết quả sẽ là chỉ mục cột nơi mà 1 được đặt.
Ví dụ: đối với hàng đầu tiên là M
.
element_wise_multiplication = [0 0 1] .* [1 2 3]
[0, 0, 3]
sum(element_wise_multiplication)
3
Cập nhật
Dựa trên các giải pháp được cung cấp bởi @reyryeng và @Luis dưới đây, tôi quyết định chạy một so sánh để xem cách thực hiện các phương pháp khác nhau so sánh.
Để thiết lập ma trận thử nghiệm (M
) Tôi đã tạo một ma trận của biểu mẫu được chỉ định trong câu hỏi gốc và thay đổi số hàng. Cột nào có 1 được chọn ngẫu nhiên bằng cách sử dụng randi([1 nCols], size(M, 1))
. Thời gian thực hiện được phân tích bằng cách sử dụng timeit
.
Khi chạy bằng cách sử dụng M
loại double
(mặc định MATLAB), bạn sẽ nhận được thời gian thực hiện sau.
Nếu M
là một logical
, sau đó các nhân ma trận có một hit do thực tế là nó đã được chuyển đổi sang một kiểu số trước khi nhân ma trận, trong khi hai người kia có một chút của một cải thiện hiệu suất.
Đây là mã thử nghiệm mà tôi đã sử dụng.
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
Cảm ơn bạn rất nhiều vì câu trả lời rất nhanh của bạn. Nó là hoàn hảo. – machinery