2017-04-17 1 views
0

Ich habe eine Sparse-Paritätsprüfungsmatrix (bestehend aus Einsen und Nullen) und ich müsste jedes Nicht-Null-Element (Einsen) durch PM ersetzen: eine quadratische Permutationsmatrix der Dimension N (wobei N im Allgemeinen eine große ganze Zahl ist). Im Fall der Nullelemente würden diese durch quadrierte Nullmatrizen derselben Dimension ersetzt werden.Ersetzen von Elementen in einer Basismatrix durch quadrierte Permutation Submatrizen

mich mit Ihnen Lassen Sie teilen die den aktuellen Zustand meines Codes ist:

Dies ist die Basismatrix, in der Ich mag würde seine diejenigen durch Permutationsmatrizen ersetzen:

B = zeros((L + ms) * dc, L * dv); 

for i = 1 : 1 : L 
    for j = 1 : 1 : dv  
     B(dc*(i-1)+1 : dc*(ms+i), j+dv*(i-1)) = ones(dc*(ms+1), 1);    
    end 
end 

ich gewesen sein einen Weg für gesagt, durch Verwendung von ‚Zelle‘ Objekte dabei ist das, H als ein Array von leeren Zellen zu initialisieren, die die entsprechenden Teilmatrizen enthalten würde:

H=repmat({{}},size(B)); 
Mc = 500 % Dimension of the permutation matrix 
MP=randi([1,5],Mc,Mc); % Definition of one permutation matrix 
% It would be desirable that the permutation matrix is different for each replacement 
[H{B==0}]=deal(zeros(Mp)); 
[H{B==1}]=deal(MP); 

Aber es‘ Es ist ein Problem, das auftauchen würde, dass ich diese Matrix als Parameter einer folgenden Funktion verwenden müsste, und es wäre sehr wünschenswert, dass es eine einfache Matrix aus Einsen und Nullen wäre (da ich mit der Zelle nicht vertraut bin). Strukturen ... Wie Sie jedoch sehen können, ist Mc eine so große Zahl, dass ich nicht weiß, ob das möglich ist.

Haben Sie eine andere Art und Weise, dies zu tun eine rohe Matrix der Dimensionen (L * ms) dc Mc, L dv Mc als Ausgabe zu haben?

Dies sind einige Parameter, die einen Versuch haben verwendet werden könnten:

für Ihre Aufmerksamkeit
ms = 2; 
Mc = 600; % any number (specially big ones) could serve for this purpose 
dc = 3; 
dv = 4; 
L = 15; 

Vielen Dank im Voraus und können Sie einen schönen Tag.

Antwort

1

Dies ist, wie es mit Zellen durchgeführt werden kann:

B = Randi([0,1], m, n); % m*n array of 1s and 0s 
H = cell(size(B));   % Define cell array 
Mc = 500;     % Size of replacement matrices 
MP = randi([1,5], Mc, Mc); % Permutation matrix 

H(B==0) = {zeros(Mc, Mc)}; % Set elements of H where B==0 to matrix of zeros 
H(B==1) = {MP};   % Set elements of H where B==1 to permutation matrix 

% Convert to matrix 
Hmat = cell2mat(H);  % Hmat = Mc*m row by Mc*n column matrix 

Jedes Zellenelement enthält eine Matrix der Größe Mc*Mc, am Ende kann dies zu einer großen Matrix umgewandelt werden. Achten Sie darauf, welche Arten von Klammern Sie für Zellen verwenden, die Klammern () sind für die logische Indizierung, während die geschweiften Klammern {} für die Zuweisung der Untermatrizen als Zellenelemente dienen.

Beispiel:

B = [1 0; 1 1]; 
MP = [1 2; 3 4]; 
H(B==0) = {zeros(2, 2)}; 
H(B==1) = {MP};  
Hmat = cell2mat(H);  

% >> Hmat = [1 2 0 0 
%    3 4 0 0 
%    1 2 1 2 
%    3 4 3 4]; 

Wenn Sie die Ersatzmatrix MP ändern mögen, können Sie dies in einer Schleife zu tun haben, MP bei jeder Iteration zu ändern und deren Verwendung ein Element von H zu ersetzen.

+1

Danke Wolfie! Anscheinend hat das geklappt. – MisterTellini

Verwandte Themen