2016-05-13 8 views
1

Ich habe Matrix R(100*100) und ich mag A(100*100) wie unter Bedingungenmit spezifischen Bedingungen

Wenn ich neue Matrix erzeugen, eine Frequenz (let us say frequency = 20) eine neue Bedingung hinzuzufügen. Damit meine ich, werden fünf Bedingungen innerhalb meiner Domain haben `(100/20) = 5

From 1 to 20, from 21 to 40, from 41 to 60, from 61 to 80, and from 81 to 100. 

Lassen Sie uns meine ursprüngliche Matrix annehmen, ist

[1 1 1……..1] 

[2 2 2 …….2] 

[3 3 3 ………3] 

And so on 

[100 100 100 …..100] 

Die neue Matrix

sein muss
From 1 to 20 same as old matrix 

[1 1 1……..1] 

[2 2 2 …….2] 

[3 3 3………3] 

From 21 to 40 

A(21,j)=R(21,j)+R(1,j) (row 21 + row 1) 

A(22,j)=R(22,j)+R(2,j) (row 22 + row 2) 

A(23,j)=R(23,j)+R(3,j) (row 23 + row 3) 

And so on 

From 41 to 60 

A(41,j)=R(41,j)+R(21,j) +R(1,j) (row 41+row 21 + row 1) 

A(42,j)=R(42,j)+R(22,j) +R(2,j) (row 42+row 22 + row 2) 

And so on 
A(81,j)=R(81,j)+R(61,j)+R(41,j)+R(21,j)+R(1,j) (row 81+row 61 + row 41 + row 21+ row 1) 

Jedes Mal, wenn ich die Frequenz erreiche, werde ich eine neue Bedingung haben. Meine Frage gibt es eine ausreichende Möglichkeit, das zu tun? Ich habe meinen Code geschrieben und es funktioniert gut, aber jedes Mal, wenn ich die Frequenz ändere, werde ich eine neue Bedingung haben. Für den Fall oben habe ich 5 conditions, aber wenn ich frequency 5 verwende, werde ich 20 conditions haben und ich muss alle Gleichungen ändern. Ich meine, ich Code benötigen

jede Frequenz zu handhaben zu können

ich unten Code schrieb

clc; 
clear; 
prompt = 'Enter Frequency=';  %Frequency=20 
N= input(prompt); 
Frequency=N; 
one_step=1/Frequency;    %Frequency 
time=Frequency*one_step; 
number_of_steps=time/one_step;  %Number of steps until next condition 
total_steps=100; 
R1 = rand(100,100); 
Number_of_Lines=(total_steps/number_of_steps)+1; %100/20 
A(100,100)=0; 
    for i=1:100 
    for j=1:100 
     if i>=1 && i<=number_of_steps 
      A(i,j)=R1(i,j); 
     elseif i>number_of_steps && i<= 2*number_of_steps 
       A(i,j)=R1(i,j)+R1(i-number_of_steps,j); 
     elseif i>2*number_of_steps && i<= 3*number_of_steps 
       A(i,j)=R1(i,j)+R1(i-number_of_steps,j)+R1(i-2*number_of_steps,j); 
     elseif i>3*number_of_steps && i<= 4*number_of_steps 
       A(i,j)=R1(i,j)+R1(i-number_of_steps,j)+R1(i-2*number_of_steps,j)... 
        +R1(i-3*number_of_steps,j); 
     elseif i>4*number_of_steps && i< 5*number_of_steps 
       A(i,j)=R1(i,j)+R1(i-number_of_steps,j)+R1(i-2*number_of_steps,j)... 
        +R1(i-3*number_of_steps,j)+R1(i-4*number_of_steps,j); 

     end 
end 

end 
+0

Ihr Split scheint ungleichmäßig zu sein "Von 1 bis 19, von 20 bis 39," könnte absichtlich sein, aber was tun Sie zum Beispiel für 'A (39, :)'? – karakfa

+0

@karakfa, Vielen Dank. Sie haben absolut Recht. Ich habe das Splitting geändert, es ist gerade jetzt. Bitte, wie kann ich diesen Code allgemein für jede Frequenz machen? – user6052232

Antwort

1

Benutzen Sie diese Schablone und konvertieren, um Ihren Fall

rows=100; cols=4; split=5; 
x=ones(rows,cols); 
c=mat2cell(x,repmat([rows/split],1,split),[cols]); 
for i=[2:split] 
    c{i,1}=c{i,1}+c{i-1,1}; 
end; 

nun Zellen von c enthält die Summen Sie brauchen. Hier verwendete ich x Matrix von Einsen, um zu zeigen, dass die Summen angesammelt werden, ersetzen Sie mit Ihrer realen Matrix. Auch Dimension kann aus der gegebenen Matrix abgeleitet werden.

+0

Vielen Dank. – user6052232