Zaloguj się
Blog na Matlab.pl
Forum polskich użytkowników
 
UŻYTKOWNICY GRUPY PROFIL Zaloguj się, by sprawdzić wiadomości FAQ
 



Napisz nowy temat     Odpowiedz do tematu Zobacz poprzedni temat :: Zobacz następny temat

Wypełnianie macierzy macierzami
Forum MATLAB Strona Główna-> MATLAB
Post Wysłany: 30 Sierpnia 2011, Wto 12:57 pm Temat postu: Wypełnianie macierzy macierzami Odpowiedz z cytatem
 
AUTOR:
loozi
Początki pisania


Dołączył: 08 Sty 2010
Posty: 8


Ogląda profil użytkownika Wyślij prywatną wiadomość
Witam,

Mam problem, a mianowicie potrzebuję utworzyć macierz nxn, gdzie n to wymiar wektora C, powiedzmy, że wektor C=[1 2 3 4]. A macierz ma wyglądać tak:
[C 0 0 0
C C 0 0
C C C 0
C C C C]
Ma to się robić automatycznie, tzn. jak długość C=5 to macierz też ma być 5x5 z wektorami C na diagonali i poniżej.

Próbowałem pętli, próbowałem funkcji tril, ale zawsze MATLAB wywalał błąd, że nie da się przypisaćSad
Może ktoś podsunie jakiś pomysł jak to zrobic?

Z góry dziękuję.


 

Post Wysłany: 30 Sierpnia 2011, Wto 1:21 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
mc2
Może pisać książki


Dołączył: 19 Maj 2009
Posty: 2053


Ogląda profil użytkownika Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora
Chodzi Ci o coś takiego?
Kod:
C = 1:5
A = tril(repmat(C',1,length(C)))

Kod:
C =
     1     2     3     4     5

A =
    
     1     0     0     0     0
     2     2     0     0     0
     3     3     3     0     0
     4     4     4     4     0
     5     5     5     5     5


Bo nie za bardzo rozumiem Twój zapis:
[C 0 0 0
C C 0 0
C C C 0
C C C C]
 

Post Wysłany: 30 Sierpnia 2011, Wto 1:46 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
Pawel B
Może pisać książki


Dołączył: 19 Lis 2008
Posty: 614
Skąd: Kraków


Ogląda profil użytkownika Wyślij prywatną wiadomość
Mi się wydaje, że chodzi o coś tego typu:
Kod:

%wektor
C = 1:4;
%ile powtorzen
n = 4;

K = zeros(size(C)*n);

for licz=1:n
    K(licz,1:length(C)*licz) = repmat(C,1,licz);
end


Ale jak to zrobić bez for'a? Nie mam pomysłu
edit: Nie zauważyłem, że wymiar końcowy ma być 5x5. W tym wypadku interpretacja mc2 jest prawidłowa, chyba, że chodzi Ci o coś takiego:
Kod:

C = 1:4;

repmat(C,4,1).*tril(ones(4,4))

>> ans =
     1     0     0     0
     1     2     0     0
     1     2     3     0
     1     2     3     4



_________________


Ostatnio zmieniony przez Pawel B dnia 30 Sierpnia 2011, Wto 1:49 pm, w całości zmieniany 1 raz
 

Post Wysłany: 30 Sierpnia 2011, Wto 1:48 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
loozi
Początki pisania


Dołączył: 08 Sty 2010
Posty: 8


Ogląda profil użytkownika Wyślij prywatną wiadomość
Widzę, że cieżko zrozumieć ten fragment który opisałem, więc może pokaże całe zadanie:

Należy w sposób automatyczny wygenerować macierz postaci:

[C, 0, 0;
CA, CB, 0;
CA^2, CAB, CB],
gdzie C=1x3, A=3x3, B=3x1.
Ale gdy wymiary poszczególnych macierzy składowych się zwiększą, np C=1x4, A=4x4, B=4x1 to macierz ma postać:
[C, 0, 0, 0;
CA, CB, 0, 0;
CA^2, CAB, CB, 0;
CA^3, CA^2B, CAB, CB].

Pierwszą kolumnę załatwia nam polecenie obsv(A,C). Później widać, że wynik tego polecenia wystarczy pomnożyć przez B, dołożyć odpowiednią ilość zer na górze a obcinać od dołuWink Ale jak to zrobić, żeby to wszystko dobrze się generowało, nie wiem:( A próbowałem już wiele sposobówSad

Proszę o jakaś wskazówke:)

Edit:
Aha,
Ja to zrobiłem "na piechotę" i wygląda to tak dla length(a)=3. Może to coś pomoże w zrozumieniu tematu.
Kod:

 a=[1, 2, 3;
     4,5,6;
     1,2,3];
 b=[3;
     4;
     5];
 c=eye(1,3);

 n=length(c);

ob=obsv(a,c);

nowa2=[0;ob*b];
nowa2=nowa2(1:n,:)

nowa3=[0;0;ob*b];
nowa3=nowa3(1:n,:)

mac=[ob,nowa2,nowa3]


Dla length(a)=4 dojdzie nowa kolumna i wyglądać będzie tak:
Kod:

 a=[1, 2, 3, 4;
     4,5,6, 7;
     1,2,3, 4;
     2, 3, 4, 5];
 b=[3;
     4;
     5;
     6];
 c=eye(1,4);

 n=length(c);

ob=obsv(a,c);

nowa2=[0;ob*b];
nowa2=nowa2(1:n,:)

nowa3=[0;0;ob*b];
nowa3=nowa3(1:n,:)

nowa4=[0;0;0;ob*b];
nowa4=nowa4(1:n,:)

mac=[ob,nowa2,nowa3, nowa4]


Ale jak widzicie, ja to robię na piechotę, nie wiem jak to zautomatyzować w jakiejś pętli:(




Ostatnio zmieniony przez loozi dnia 30 Sierpnia 2011, Wto 2:21 pm, w całości zmieniany 1 raz
 

Post Wysłany: 30 Sierpnia 2011, Wto 1:58 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
mc2
Może pisać książki


Dołączył: 19 Maj 2009
Posty: 2053


Ogląda profil użytkownika Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora
Ja ciągle nie rozumiem. Możesz podac przykład na konkretnych wektorach i macierzach?
Bo co ma oznaczać zapis, że w elemencie (1,1) umieszczamy wektor C?
 

Post Wysłany: 30 Sierpnia 2011, Wto 2:08 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
loozi
Początki pisania


Dołączył: 08 Sty 2010
Posty: 8


Ogląda profil użytkownika Wyślij prywatną wiadomość
No w kodzie myślałem, że to widać, to znaczy, że macierz mac=[C, 0, 0; C, C, 0; C, C, C], a C=[1,2,3], to wynik będzie
[1,2,3,0,0,0,0,0,0;
1,2,3,1,2,3,0,0,0;
1,2,3,1,2,3,1,2,3]
Smile


 

Post Wysłany: 30 Sierpnia 2011, Wto 2:57 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
Pawel B
Może pisać książki


Dołączył: 19 Lis 2008
Posty: 614
Skąd: Kraków


Ogląda profil użytkownika Wyślij prywatną wiadomość
To od tego masz ten kod:
Kod:

%wektor
C = 1:4;
%ile powtorzen
n = 4;

K = zeros(size(C)*n);

for licz=1:n
    K(licz,1:length(C)*licz) = repmat(C,1,licz);
end



_________________
 

Post Wysłany: 30 Sierpnia 2011, Wto 3:04 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
loozi
Początki pisania


Dołączył: 08 Sty 2010
Posty: 8


Ogląda profil użytkownika Wyślij prywatną wiadomość
Ok, z waszą pomocą udało mi się to zrobić, dzięki!!
Zamykam temat!Smile


 

Post Wysłany: 31 Sierpnia 2011, Sro 8:26 am Temat postu: Odpowiedz z cytatem
 
AUTOR:
mc2
Może pisać książki


Dołączył: 19 Maj 2009
Posty: 2053


Ogląda profil użytkownika Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora
Pawel B napisał:
Mi się wydaje, że chodzi o coś tego typu:
Kod:

%wektor
C = 1:4;
%ile powtorzen
n = 4;

K = zeros(size(C)*n);

for licz=1:n
    K(licz,1:length(C)*licz) = repmat(C,1,licz);
end


Ale jak to zrobić bez for'a? Nie mam pomysłu

Mój pomysł na ominięcie petli:
Kod:
n = 5
c = 1:n;
a = repmat(c,n,n);
[x y] = meshgrid((n*(1:n)),1:n*n);
a((x<y)') = 0


Porównanie czasu obliczeń:
Kod:
N = 50;
t = zeros(N-1,2);
for n=2:N
    
    tic
    c = 1:n;
    a = repmat(c,n,n);
    [x y] = meshgrid((n*(1:n)),1:n*n);
    a((x<y)') = 0;
    t(n-1,1) = toc;
    clear c a x y
    
    tic
    C = 1:n;
    K = zeros(size(C)*n);
    for licz=1:n
        K(licz,1:length(C)*licz) = repmat(C,1,licz);
    end
    t(n-1,2) = toc;
    clear C K licz
end
semilogy(t)
 

Forum MATLAB Strona Główna-> MATLAB
Wyświetl posty z ostatnich:   

Napisz nowy temat     Odpowiedz do tematu Zobacz poprzedni temat :: Zobacz następny temat

Wszystkie czasy w strefie CET (Europa)

Skocz do:  

Statystyki forum:



Od dnia 08.06.2006 forum odwiedzano 20331661
Najwięcej użytkowników 90 było obecnych 29 Maj 2010, Sob 7:37 pm

Aktualnie online:




Najnowsze posty na forum:
Proste zadanko  (20 Października 2014, Pon 6:27 pm)
jak zapisac plik .mat jako plik .txt  (20 Października 2014, Pon 11:11 am)
Prosty regulator adaptacyjny.  (19 Października 2014, Nie 10:50 am)
[Scilab] Image and Video Processing toolbox nie dziala  (18 Października 2014, Sob 7:43 pm)
model stanowiska simulink  (18 Października 2014, Sob 11:50 am)
Jak wypisać w uitable zmienną z tekstem i liczbami  (17 Października 2014, Pią 3:21 pm)
Prosta prostopadła  (17 Października 2014, Pią 3:13 pm)
Zagadnienie regresji wielokrotnej  (17 Października 2014, Pią 1:17 pm)
dobór nastaw metodą zieglera-nicholsa  (16 Października 2014, Czw 12:24 pm)
Interpolacja  (16 Października 2014, Czw 8:38 am)
Twoje prawa:
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Nie możesz ściągać plików na tym forum