Obskur kode, største verdi i matrise ved gjennomsnitt

Det er god trening å prate matematikk. Her er det fritt fram for alle. Obs: Ikke spør om hjelp til oppgaver i dette underforumet.

Moderators: Vektormannen, espen180, Aleks855, Solar Plexsus, Gustav, Nebuchadnezzar, Janhaa

Post Reply
Nebuchadnezzar
Fibonacci
Fibonacci
Posts: 5648
Joined: 24/05-2009 14:16
Location: NTNU

Prøvde å skrive en litt obskur kode i matlab, både for å trene og for å skrive litt annerledes ting. Koden skal ta inn en matrise, gjør noen merkelige ting og returnere den største verdien til matrisen, og rad og kolonne.

Måten dette blir gjort på er å ta bort alle verdier som er mindre enn gjennomsnittet, til en bare står igjen med ett tall. Koden fungerer dog ikke. Jeg får en feil her

Code: Select all

        for i = 1:length(k)
          matrise(k(i))=[];
        end
Og jeg aner ikke helt hva som er feilen. Står at den er utenfor rekkevidde av matrisen. Men for det første så vil vel lengden til k, alltid være mindre enn matrisens verdi (strengt talt en kolonnevektor). Så ja, hjelp? =)

Code: Select all

function [ X Y Z ] = MaTrIx( matrise2 )

n = 0;

matrise = matrise2

    if length(matrise)<numel(matrise)/length(matrise)
        b = numel(matrise)/length(matrise);
        a = length(matrise);
    else
        a = numel(matrise)/length(matrise);
        b = length(matrise);
    end

for j=1:a
    for i=1:b
        n = matrise(j,i) + n;
    end
end

    matrise = matrise(:)';

    while numel(matrise)>1

    K = n/(length(matrise));

    k = find(matrise<K)

        for i = 1:length(k)
          matrise(k(i))=[];
        end

    n=0;

        for i=1:numel(matrise)
           n = matrise(i) + n;
        end

    end
    
[Y X] = find(sum(matrise));

Z = sum(matrise);

end
"Å vite hva man ikke vet er og en slags allvitenhet" - Piet Hein
https://s.ntnu.no/Integralkokeboken
Lektor - Matematikk, Fysikk og Informatikk
drgz
Fermat
Fermat
Posts: 757
Joined: 24/12-2008 23:22

Code: Select all

A_max = max(A(:));
[r c] = find(A==A_max);
eventuelt

Code: Select all

[m n] = size(A);
A_max = 0;
r = 0;
c = 0;

for m1 = 1:m
    for n1 = 1:n
        if A(m1,n1) > A_max
            A_max = A(m1,n1);
            r = m1;
            c = n1;
        end
    end
end
Hvis du vil gjøre det med din metode der du "fjerner" elementer som er mindre enn gjennomsnittet så kan man bruke

Code: Select all

nl = numel(A);
ss = sum(sum(isnan(A)));
while ss ~= nl-1
    ss = sum(sum(isnan(A)));
    a_mu = mean(mean(A(~isnan(A))));
    A(A<a_mu) = NaN;
end
[r c] = find(isnan(A)==0);
Og hvis du faktisk vil fjerne elementene så kan går det an med noe ala

Code: Select all

a = A(:);
nl = length(a);

while nl ~=1
    a_mu = mean(a(~isnan(a)));
    a(a<a_mu) = [];
    nl = length(a);
end
[r c] = find(A==a)
for å finne den største verdien, men du må søke i den opprinnelige matrisen etter max-verdien for å finne indeksene til dette elementet.
Post Reply