cut of zeros from a matrix based on the longest non-zero row

Hi all,
I want to cut all zeros from the right, based on "the longest non zero row". an example:
A=[ 1 2 0 0 0 0;3 4 5 0 0 0;5 6 0 0 0 0];
output: A=[ 1 2 0 ;3 4 5 ;5 6 0 ];
thanks in advance!

1 Kommentar

Try it yourself first please. We can then look at the code together.

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

Dave B
Dave B am 22 Nov. 2021
Bearbeitet: Dave B am 22 Nov. 2021
Another way to phrase this question is to say you want to remove columns from the right side of the matrix if the whole column is zeros:
A=[ 1 2 0 0 0 0;3 4 5 0 0 0;5 6 0 0 0 0];
lastnonzero=find(any(A~=0,1),1,'last') % the last column with a non-zero row
lastnonzero = 3
A(:,lastnonzero+1:end)=[]
A = 3×3
1 2 0 3 4 5 5 6 0

3 Kommentare

OK, much better than mine :)
Didn't know about any. Notice that your code will ingore non-zero negatives.
oops, I updated to be ~=0, thanks for catching that! (technically it can just be any(A), but I find that specifying the condition explicitly is more readable)
any and all are very useful! they also take a dimension arg, or the keyword 'all' which I use often.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Net Fre
Net Fre am 22 Nov. 2021
Bearbeitet: Net Fre am 22 Nov. 2021
Hi
You can use the cumprod function.
your code line can look like this:
% a = some matrix
idx = max(sum(cumprod(a~=0,2)),2)
output = a(:,1:idx)
I suggest you break the one line into several ones just to see what each function does.
hope this helps.

Kategorien

Mehr zu Programming finden Sie in Hilfe-Center und File Exchange

Produkte

Version

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by