Subtract each column of matrix until -3 is finished

For example, i have a matrix a = [0 1 2 3 4]. How do I subtract each column by 1?
a = [0 3 2 6 4]
b = [0 2 1 2 3]
remainder = size(a, 2) - sum(b)
The remainder is -3. I need to minus from b when b(i) ~= 0 so that at the end the b = [0 1 0 1 3].
Thank you.

 Akzeptierte Antwort

Fangjun Jiang
Fangjun Jiang am 14 Dez. 2011
I am curious too. Let me guess.
a=0:4;
b=-3; % b is an integer, positive or negative
c=zeros(size(a));
ind=find(a,1);
c(ind:ind+abs(b)-1)=-1;
a=a+c
a =
0 0 1 2 4
Updated for a generic solution
b = [0 2 1 2 3]
remainder=-6;
ind=find(b);
while remainder<0 && ~isempty(ind)
if length(ind)<=abs(remainder)
b(ind)=b(ind)-1
remainder=remainder+length(ind)
ind=find(b);
else
for k=1:abs(remainder)
b(ind(k))=b(ind(k))-1
remainder=remainder+1
end
end
end
b =
0 2 1 2 3
b =
0 1 0 1 2
remainder =
-2
b =
0 0 0 1 2
remainder =
-1
b =
0 0 0 0 2
remainder =
0

9 Kommentare

Chin
Chin am 14 Dez. 2011
Actually I have a remainder = 3 and I would like reduce the remainder from the matrix column one by one so that at the end the the remainder is 0.
What is "remainder"? What will you do if you do it manually, like solve it with a pencil and paper?
Chin
Chin am 14 Dez. 2011
I already edit the question and your answer is accepted but I am facing one more problem. if now the remainder = -6 then how do i get the result so that now b = [0 0 0 0 2].
For example,
b = [0 2 1 2 3]
when b(i) ~= 0 then
b = [0 2 1 2 3]
-1 -1 -1 -1
b = [0 1 0 1 2]
-1 -1
so total is minus 6 times. Is this more clear.
For that, you can use the while-loop. See updated answer.
Chin
Chin am 15 Dez. 2011
Thanks a lot.
Chin
Chin am 16 Dez. 2011
I would like to know if this time I am using c = [0 1.2 2.3 0 0.4] and i would like to subtract the remainder from a based on the c matrix from the smallest number to the largest number.
For example,
c = [0 1.2 2.3 0 0.4]
remainder = -3
b = [0 2 1 2 3]
final answer is
b = [0 1 1 1 2]
then the remainder will subtract from b(4) first, second is b(5) and the final is b(2). If c(1)=0 and the b(1)=0 then ignore. how do I get the correct indexing? Thank you.
Chin
Chin am 16 Dez. 2011
I already done a code
a = [0 1.2 2.3 0 0.4];
d = [0 2 1 2 3];
remainder = -3;
for i = 1 : size(d, 2)
c(i) = i;
end
[row col] = sort(a, 'ascend');
for j = 1 : size(col, 2)
if a(col(j)) && d(c(j)) ~= 0
col = col(1 : abs(remainder));
d(col) = d(col) - 1
end
end
but I getting error message and also cannot get the b=[0 1 1 1 2]. What I am missing?
I am confused with the c and a. I suggest you ask a separate question and use variable name consistently. Also, explain the logic or step. If it's hard to explain, try to show your step and intermediate result if you do it manually, like using a pencil and a piece of paper.
Chin
Chin am 16 Dez. 2011
ok. thanks. i will ask in another question.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Walter Roberson
Walter Roberson am 14 Dez. 2011
Does the minus sign of -3 indicate the third from the start or the third from the end? Your example is ambiguous about that.
Third from the start:
a(1:abs(b)) = a(1:abs(b)) - 1;
Third from the end:
a(1:end-abs(b)+1) = a(1:end-abs(b)+1) - 1;

2 Kommentare

The result are all wrong though!
ind = find(a);
ind = ind(1:abs(b));
a(ind) = a(ind) - 1;

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Parallel Computing Toolbox finden Sie in Hilfe-Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by