Tôi có một ma trận có một số giá trị bằng 0 mà tôi muốn xóa.
a=[1 2 3 0 0;
>>a=
1 2 3 0 0
1 0 1 3 2
0 1 2 5 0
Tuy nhiên, tôi chỉ muốn xóa những giá trị đó sau giá trị khác 0 cuối cùng của mỗi hàng. Điều này có nghĩa là tôi muốn giữ hàng đầu tiên của 1 2 3
, dòng thứ hai 1 0 1 3 2
và dòng thứ hai 0 1 2 5
Cái thứ ba.
Sau đó tôi muốn lưu trữ các giá trị còn lại trong một vectơ. Trong trường hợp của ví dụ, điều này sẽ dẫn đến vectơ
b=[1 2 3 1 0 1 3 2 0 1 2 5]
Cách duy nhất tôi nghĩ ra liên quan đến điều mà tôi muốn tránh for
xe đạp:
b=[];
với ii=1:size(a,1)
l=max(find(a(ii,:)));
b=[ba(ii,1:l)];
end
Có cách nào để vector hóa mã này không?
Có nhiều cách để làm điều này, đây là cách tiếp cận của tôi:
arotate = a' %//xoay ma trận a 90 độ
b=flipud(arotate) %//lật ma trận lên và xuống
c= flipud(cumsum(b,1)) %//tổng tích lũy các hàng ma trận -và sau đó lật ngược lại.
arotate(c==0)=[]
xoay =
1 2 3 1 0 1 3 2 0 1 2 5
==========================Chỉnh sửa=========================
Chỉ cần nhận ra rằng cumsum có thể có tham số hướng, vì vậy nó nên làm điều này:
arotate = a'
b = cumsum(arotate,1,'reverse')
arotate(b==0)=[]
Tham số hướng này không có sẵn trong phiên bản 2010b của tôi, nhưng nó sẽ có sẵn nếu bạn đang sử dụng 2013a trở lên.
Về matlab - Chuyển đổi ma trận thành vectơ xếp chồng trong đó tất cả các số 0 sau giá trị khác 0 cuối cùng của mỗi hàng đều bị xóa, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/37484469/
Tôi là một lập trình viên xuất sắc, rất giỏi!