Nếu bạn muốn tránh phải sử dụng một vòng lặp for, đây có lẽ là cách sạch nhất để làm điều đó:
indexCell = num2cell(indexmatrix,1);
linearIndexMatrix = sub2ind(size(kDimensionalMatrix),indexCell{:});
finalTable = kDimensionalMatrix(linearIndexMatrix);
GIẢI THÍCH:
Dòng đầu tiên đặt mỗi cột của indexmatrix vào các ô riêng biệt của mảng ô sử dụng NUM2CELL. Điều này cho phép chúng ta vượt qua tất cả k cột như một comma-separated list vào SUB2IND, một chức năng có thể chuyển đổi chỉ số subscripted (hàng, cột, vv) vào chỉ số tuyến tính (mỗi phần tử ma trận được đánh số từ 1 đến N, N là tổng số phần tử trong ma trận). Dòng cuối cùng sử dụng các chỉ số tuyến tính này để thay thế vòng lặp for của bạn. Một cuộc thảo luận tốt về lập chỉ mục ma trận (chỉ số, tuyến tính và logic) có thể được tìm thấy here.
một số chi tiết thực phẩm cho rằng ...
Các xu hướng né tránh cho vòng ủng hộ giải pháp vectorized là một cái gì đó nhiều người sử dụng MATLAB (trong đó có tôi) đã trở nên quen với. Tuy nhiên, các phiên bản mới hơn của MATLAB xử lý vòng lặp hiệu quả hơn nhiều. Như đã thảo luận trong this answer đối với một câu hỏi SO khác, việc sử dụng cho các vòng lặp đôi khi có thể dẫn đến mã chạy nhanh hơn bạn sẽ nhận được với một giải pháp được vector hóa.
Tôi chắc chắn KHÔNG nói rằng bạn không nên cố gắng mã hóa mã của bạn nữa, chỉ có mọi vấn đề là duy nhất. Vectorizing sẽ thường là hiệu quả hơn, nhưng không phải luôn là. Đối với vấn đề của bạn, tốc độ thực hiện của vòng lặp so với mã vectơ có thể sẽ phụ thuộc vào giá trị lớn như thế nào n và k.
Tuyệt vời! Bạn có thể làm cho nó độc lập với số hàng không? – AnnaR
@AnnaR - Tôi vừa đăng câu trả lời xử lý tất cả 'n' hàng' indexmatrix' cùng một lúc. – Shai