For loop or Array?
Mostra commenti meno recenti
Have a matrix [0 0 0 0 0 0; 0 0 0 1 1 1; 0 0 0 0 1 1; 0 0 0 0 1 1; 0 0 0 0 0 1; 0 0 0 1 1 1]. Want Matlab, in any row it encounters 1, to replace the first three zeros before the 1 with 1 so that I will have something like this [0 0 0 0 0 0; 1 1 1 1 1 1; 0 1 1 1 1 1; 0 1 1 1 1 1; 0 0 1 1 1 1; 1 1 1 1 1 1]. How do I go about this? I have a very big matrix I am dealing with.
4 Commenti
Williams Ackaah
il 29 Lug 2015
Andrei Bobrov
il 29 Lug 2015
Modificato: Andrei Bobrov
il 29 Lug 2015
see part of my answer after 'add'
Williams Ackaah
il 31 Lug 2015
Modificato: Williams Ackaah
il 31 Lug 2015
Stephen23
il 31 Lug 2015
Using loops seems reasonable to me.
Your requirements exclude the use of circshift and cumsum in a trivial combination (e.g. Andrei Bobrov's initial answer). While there might be more compact solutions, using loops is likely the least obfuscated and yet also reasonably fast.
Risposte (2)
Andrei Bobrov
il 29 Lug 2015
Modificato: Andrei Bobrov
il 29 Lug 2015
out = cumsum(circshift(A,[0,3]),2)>0;
add
m = 3
b = [zeros(size(A,1),1),diff(A,[],2)]==1;
out = cumsum(b(:,[m+1:end,1:m])-b,2)+A;
>> A = [0 0 0 0 1 1 0 0 0 0 0 1 1; 0 0 0 1 1 1 0 0 0 0 1 1 1; 0 0 0 1 1 1 0 0 0 0 1 1 1; 0 0 0 0 0 1 0 0 0 0 0 0 1]
A =
0 0 0 0 1 1 0 0 0 0 0 1 1
0 0 0 1 1 1 0 0 0 0 1 1 1
0 0 0 1 1 1 0 0 0 0 1 1 1
0 0 0 0 0 1 0 0 0 0 0 0 1
>> B = A;
>> for k = 1:3, B(:,4-k:end-k) = B(:,4-k:end-k) | A(:,4:end); end
>> B
B =
0 1 1 1 1 1 0 0 1 1 1 1 1
1 1 1 1 1 1 0 1 1 1 1 1 1
1 1 1 1 1 1 0 1 1 1 1 1 1
0 0 1 1 1 1 0 0 0 1 1 1 1
Categorie
Scopri di più su Loops and Conditional Statements in Centro assistenza e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!