how to reduce the size of array as small as the smallest array to have them in one matrix
Afficher commentaires plus anciens
Hello everyone
I have three arrays and size of each is x 1*104 , y is 1*100 and z is 1*95 and I Have them in a matrix like : T = [x ; y ;z]
How I reduce the size of y and x and make them as large as z to not have inconsistent error
Thanks in advance
3 commentaires
Stephen23
le 26 Fév 2023
Download Jos' excellent function PADCAT:
Image Analyst
le 26 Fév 2023
What is in the extra 9 elements of the x row vector? What is in the extra 5 elements of the y row vector? Zeros? Nans? How are they all aligned? What criteria do you want to use to throw out 10 values from x and 5 values from y? What does "inconsistent" mean to you? Give an example with shorter arrays to explain the logic you want to use.
If you have any more questions, then attach your data and code to read it in with the paperclip icon after you read this:
the cyclist
le 26 Fév 2023
Considering a specific, smaller version of your problem, suppose your inputs are
x = [2 3 5 7 11]; % length 5
y = [13 17 19] % length 3
z = [23 29]; % length 2
What would you want the output to be?
Réponses (1)
There are several possibilities:
- Fill the shorter arrays with zeros or NaNs on the top, bottom or both.
- Crop the longer arrays at the start or end.
- Interpolate two vectors to have the same size as the 3rd one.
- Interpolate all vectors to a greater or smaller number of elements.
With the shorter example of the cyclist:
x = [2 3 5 7 11]; % length 5
y = [13 17 19]; % length 3
z = [23 29]; % length 2
a = zeros(3, 5); % Or nan(3, 5)
a(1, :) = x;
a(2, 1:numel(y)) = y;
a(3, 1:numel(z)) = z
nz = numel(z);
b1 = [x(1:nz); ...
y(1:nz);
z]
b2 = [x(numel(x) - nz + 1:numel(x)); ...
y(numel(y) - nz + 1:numel(y)); ...
z]
c1 = [x; ...
interp1(1:numel(y), y, linspace(1, numel(y), numel(x))); ...
interp1(1:numel(z), z, linspace(1, numel(z), numel(x)))]
c2 = [interp1(1:numel(x), x, linspace(1, numel(x), nz)); ...
interp1(1:numel(y), y, linspace(1, numel(y), nz)); ...
z]
c3 = [interp1(1:numel(x), x, linspace(1, numel(x), 10)); ...
interp1(1:numel(y), y, linspace(1, numel(y), 10)); ...
interp1(1:numel(z), z, linspace(1, numel(z), 10))]
4 commentaires
Image Analyst
le 26 Fév 2023
Modifié(e) : Image Analyst
le 26 Fév 2023
But the original poster wanted "reduce the size of y and x" so he wants to throw out some elements of x and y so that the final matrix is 3x2, with only 2 columns (like z has). He wants x and y to be smaller and the same size as the shorter z. That's why I asked what are the criteria for shortening x and y.
Jan
le 26 Fév 2023
@Image Analyst: Oh, my fault. I've included code for reducing now. The methods are actually easy, but the OP has to decide, what is wanted.
arash rad
le 26 Fév 2023
Image Analyst
le 27 Fév 2023
@arash rad OK, so you just wanted to crop off any part of the vectors that are beyond the length of Z. It would have eliminated a lot of confusion if you had just explained that in the very initial post.
Catégories
En savoir plus sur Matrices and Arrays dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!