Change value based on the values of another column

22 visualizaciones (últimos 30 días)
Krishna
Krishna el 5 de Ag. de 2022
Comentada: Star Strider el 8 de Ag. de 2022
I have a table with 2 columns and 6000 rows each. Sample values in the 1st column is like:
-0.00554
-0.00503
-0.00406
-0.00406
-0.00316
-0.00274
-0.00274
0
0
0
0
0
0
0.00233
0.00452
0.00552
0.00715
0.00831
0
0
-9.00000000000000e-05
-9.00000000000000e-05
-9.00000000000000e-05
-9.00000000000000e-05
-9.00000000000000e-05
-9.00000000000000e-05
-9.00000000000000e-05
0
0
0
0.00552
0.00715
0.00831
0.00715
0.00831
0
0
0
0
0
-0.00406
-0.00316
The corresponding values in the 2nd column will be starting from 1,2,3, etc. until the positive value changes again to negative value in the 1st column. To be more specific, 1st column will be having values starting with -ve sign followed by 0s and +ve values. So, the -ve value will be changing to +ve and again back to -ve. Once the -ve value show up again, the count on the 2nd column should start from 1 again. Please help me wih this.

Respuesta aceptada

Star Strider
Star Strider el 5 de Ag. de 2022
Another approach —
v = [-0.00554
-0.00503
-0.00406
-0.00406
-0.00316
-0.00274
-0.00274
0
0
0
0
0
0
0.00233
0.00452
0.00552
0.00715
0.00831
0
0
-9.00000000000000e-05
-9.00000000000000e-05
-9.00000000000000e-05
-9.00000000000000e-05
-9.00000000000000e-05
-9.00000000000000e-05
-9.00000000000000e-05
0
0
0
0.00552
0.00715
0.00831
0.00715
0.00831
0
0
0
0
0
-0.00406
-0.00316];
sv = sign(v);
sv(sv>=0) = 1; % Adjust 'sign' Vector
pn = [0 strfind(sv.', [1 -1]) numel(v)]; % +vn To -ve Transition Indices
for k = 1:numel(pn)-1
idx = [pn(k) pn(k+1)-1]+1; % Index Range
Col2(idx(1):idx(2)) = (idx(1) : idx(2)) - (idx(1)-1); % Create Column #2 (As Row Vector)
end
Result = [v, Col2(:)] % Full Matrix
Result = 42×2
-0.0055 1.0000 -0.0050 2.0000 -0.0041 3.0000 -0.0041 4.0000 -0.0032 5.0000 -0.0027 6.0000 -0.0027 7.0000 0 8.0000 0 9.0000 0 10.0000
ResultMtx = [Result(1:10,:) Result(11:20,:) Result(21:30,:) Result(31:40,:)] % Display (Remove Later)
ResultMtx = 10×8
-0.0055 1.0000 0 11.0000 -0.0001 1.0000 0.0055 11.0000 -0.0050 2.0000 0 12.0000 -0.0001 2.0000 0.0072 12.0000 -0.0041 3.0000 0 13.0000 -0.0001 3.0000 0.0083 13.0000 -0.0041 4.0000 0.0023 14.0000 -0.0001 4.0000 0.0072 14.0000 -0.0032 5.0000 0.0045 15.0000 -0.0001 5.0000 0.0083 15.0000 -0.0027 6.0000 0.0055 16.0000 -0.0001 6.0000 0 16.0000 -0.0027 7.0000 0.0072 17.0000 -0.0001 7.0000 0 17.0000 0 8.0000 0.0083 18.0000 0 8.0000 0 18.0000 0 9.0000 0 19.0000 0 9.0000 0 19.0000 0 10.0000 0 20.0000 0 10.0000 0 20.0000
ResultEnd = Result(41:end,:) % Display (Remove Later)
ResultEnd = 2×2
-0.0041 1.0000 -0.0032 2.0000
.
  10 comentarios
Star Strider
Star Strider el 8 de Ag. de 2022
The values for ‘Input1’ are different, and I do not understand how either it or ‘Output’ are incremented.
I just do not see any sort of pattern here that lends itself to being coded.

Iniciar sesión para comentar.

Más respuestas (2)

dpb
dpb el 5 de Ag. de 2022
Editada: dpb el 5 de Ag. de 2022
If there's always at least one zero before the new -ive value excepting the initial element, then
ix=find(diff(sign([0;x]))==-1);
will locate the beginng line of each section.
Or, actually, on reflection,
ix=find(diff(sign([0;x]))<0);
will find a transition from either 0 to -ive or +ive to -ive
  2 comentarios
Krishna
Krishna el 5 de Ag. de 2022
I'm running this code inside a loop as depicted below:
for k = 1:rows
ix = find(diff(table.first_column([0;k]))<0);
if(ix < 0)
table.second_column(k) = 1;
end
end
But, while running this code, I'm getting an error like:
"Array indices must be positive integers or logical values."

Iniciar sesión para comentar.


Andrei Bobrov
Andrei Bobrov el 5 de Ag. de 2022
v = [-0.00554
-0.00503
-0.00406
-0.00406
-0.00316
-0.00274
-0.00274
0
0
0
0
0
0
0.00233
0.00452
0.00552
0.00715
0.00831
0
0
-9.00000000000000e-05
-9.00000000000000e-05
-9.00000000000000e-05
-9.00000000000000e-05
-9.00000000000000e-05
-9.00000000000000e-05
-9.00000000000000e-05
0
0
0
0.00552
0.00715
0.00831
0.00715
0.00831
0
0
0
0
0
-0.00406
-0.00316];
s = sign(v);
p = diff([0;s]) == -1 & s == -1;
i = accumarray(cumsum(p),1);
x = ones(size(p));
x(p) = x(p) - [ 0;i(1:end-1)];
out = cumsum(x);

Categorías

Más información sobre Logical en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by