Is it possible to truncate a vector to form one of lower dimension?

60 visualizaciones (últimos 30 días)
Charles
Charles el 25 de Mayo de 2023
Editada: James Tursa el 25 de Mayo de 2023
Is there a way to truncate a vector to eliminate the end terms? For example, a=[1;2;3;4;5;6;7;8;9], I want b=[1;2;3;4;5]. Is there a way to form b from a by truncating the last four terms of a?

Respuestas (2)

John D'Errico
John D'Errico el 25 de Mayo de 2023
Editada: John D'Errico el 25 de Mayo de 2023
You have two choices. First, you can extract the elements you want. Or you can delete the elements you wnat to drop. For example:
V = primes(40)
V = 1×12
2 3 5 7 11 13 17 19 23 29 31 37
Now, drop the last 4 elements.
n = 4;
% This deletes the elements of V that you want to delete, and does so
% "in-place", in the sense that we do not assign a new vector.
V(end + (1-n:0)) = []
V = 1×8
2 3 5 7 11 13 17 19
Next, we can decide to extract all but the last n elements. I'll just use the last version of V.
V = V(1:end - n)
V = 1×4
2 3 5 7
In each case, we can see that the final 4 elements of V were dropped from V. As I said though, you can think of the second case as where I extracted the elements I wanted to save, while in the first case, I indicated the elements I wanted to delete.
  1 comentario
James Tursa
James Tursa el 25 de Mayo de 2023
Editada: James Tursa el 25 de Mayo de 2023
For clarification, to my knowledge MATLAB always allocates new memory when an indexed assignment results in a different size. E.g.,
>> format debug
>> v = 1:10
v =
Structure address = 1dd33fd5fc0
m = 1
n = 10
pr = 1dd1e418b20
1 2 3 4 5 6 7 8 9 10
>> v(end)=[]
v =
Structure address = 1dd33fd7a00
m = 1
n = 9
pr = 1dd2de51500
1 2 3 4 5 6 7 8 9
You can see that even though we only deleted the last element, the data pointer pr changed, indicating that MATLAB allocated new memory and did a data copy of the rest. Maybe MATLAB could have been smarter and simply changed the dimensions directly in this case since that would only waste one element of memory, but it doesn't. The only way to delete trailing elements and retain the same data memory block (which is faster since no data copy is involved) is by unofficial hacking into the variable header and resetting the dimensions directly via a mex routine. This used to be possible on older versions of MATLAB, but later versions of MATLAB hide the shared data copies of variables from the user so even this is no longer possible.

Iniciar sesión para comentar.


Diwakar Diwakar
Diwakar Diwakar el 25 de Mayo de 2023
You may try this code:
a = [1;2;3;4;5;6;7;8;9];
b = a(1:end-4);

Categorías

Más información sobre Loops and Conditional Statements en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by