How to perform mathematical operation in columns on certain elements and make the other elements zero??

24 visualizzazioni (ultimi 30 giorni)
For example I have this matrix:
[0 0
0 0
1 0
2 7
5 8
3 11
4 12
2 9]
The min and max value of column one are (1,5) and column 2 are (7,12). I want to perform a specific operation a*b when the min value occurs in each column and perform a*(b-2) to its next value. similarly when max value occurs I want to perform a/b at max value and a/(b-2) to its next value. All the other values must remain zero.
Here
a=10; a*b=10; a*(b-2)=-10
b=1 a/b=10; a/(b-2)=-10
The new matrix should be like:
Ans=[ 0 0
0 0
10 0
-10 10
10 -10
-10 0
0 10
0 -10]
Can someone please help????thankyou in advance.

Risposta accettata

dpb
dpb il 16 Mag 2020
Modificato: dpb il 17 Mag 2020
Don't try to get too fancy...sometimes just deadahead is the simplest and best (and probably fastest, besides)...
a=10; % constants and compute insertion vectors
b=1;
vMIN=[a*b;a*(b-2)];
vMAX=[a/b;a/(b-2)];
A(A==0)=nan; % prelim fixup to exclude 0 from min/max
for i=1:size(A,2) % engine for each column...
[~,imn]=min(A(:,i)); % location min, max
[~,imx]=max(A(:,i));
A(imn:imn+1,i)=vMIN; % replace element and next
A(imx:imx+1,i)=vMAX;
end
A(isnan(A)=0; % restore the zeros...
NB1: Must do search for locations and save before either substitution...
NB2: Presumes min/max is not in last row of A or will get out-of-bounds addressing error.
  4 Commenti

Accedi per commentare.

Più risposte (1)

Stephen23
Stephen23 il 19 Mag 2020
Modificato: Stephen23 il 20 Mag 2020
Something fancy...
>> M = [0,0;0,0;1,0;2,7;5,8;3,11;4,12;2,9]
M =
0 0
0 0
1 0
2 7
5 8
3 11
4 12
2 9
>> a = 10;
>> b = 1;
>> F = @(f,v) conv2(+(M==f(M./~~M,[],1)),[0;v],'same'); % requires >=R2016b
>> Q = F(@max,[a/b;a/(b-2)]) + F(@min,[a*b;a*(b-2)])
Q =
0 0
0 0
10 0
-10 10
10 -10
-10 0
0 10
0 -10
For earlier versions replace == with bsxfun.
  5 Commenti
Stephen23
Stephen23 il 20 Mag 2020
@dpb: With so much data-duplication going on, to be honest I was quite surprised at the speed: most of the operators in that anonymous function create a new array with the same size as the input data. This does take its toll on larger input arrays: your loop tends to be faster on the larger arrays I tried.
The fastest approach I found was to split the vector indexing in your solution into two scalars, i.e.:
A(imn,i) = a*b;
A(imn+1,i) = a*(b-2);
etc.
No doubt all of these results are highly dependent on the MATLAB version anyway, and writing something readable/understandable/maintainable is of course much preferred.
dpb
dpb il 20 Mag 2020
" fastest approach I found was to split the vector indexing in your solution into two scalars"
The [;] operation has always been expensive. I get warnings about avoiding brackets all the time that I mostly ignore since not writing production code and I find them more legible...but if such code were buried in the bowels of a loop or iterative solution it then could be worth the less expressive form.
Interesting result...

Accedi per commentare.

Categorie

Scopri di più su Characters and Strings in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by