Azzera filtri
Azzera filtri

normalize all but the zeros in a vector?

4 visualizzazioni (ultimi 30 giorni)
I have a vector that contains 0s, something like this [44 0 23 19 0 0 30]
and I want to normalize the non-0 elements to 1-10, for instance, but the 0s keep messing it up.
Is there a way (hopefully without using loops) to normalize while not affecting the 0s? In other words, take the values from 19-44 and convert them to stretch over 1-10.

Risposta accettata

Dyuman Joshi
Dyuman Joshi il 24 Dic 2023
Modificato: Dyuman Joshi il 24 Dic 2023
%Input
in = [44 0 23 19 0 0 30];
%Lazy preallocation, assuming all values are finite and not NaNs
out = 0*in;
%Indexing for non-zeros values
idx = in~=0;
%Output
out(idx) = rescale(in(idx), 1, 10)
out = 1×7
10.0000 0 2.4400 1.0000 0 0 4.9600
  6 Commenti
Dyuman Joshi
Dyuman Joshi il 24 Dic 2023
"But as soon as I say that, it will happen."
Haha, yes.
Mine used to be that too, but I am not sure how it changed into multiplying with 0. I think I'll go back to using zeros() soon, specially noting the difference in speed.
However, keeping performance in mind, maybe I should revisit this thread - https://in.mathworks.com/matlabcentral/answers/51411-initialize-a-mxn-matrix-with-the-same-number#answer_453549
Walter Roberson
Walter Roberson il 24 Dic 2023
y = zeros(size(x), 'like', x);
for extra robustness.

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su Loops and Conditional Statements in Help Center e File Exchange

Tag

Prodotti


Release

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by