2017-03-09 25 views
3

Ich habe eine symmetrische Matrix von einigen statistischen Werten, die ich mit Hilfe von imagesc in Matlab plotten möchte. Die Größe der Matrix ist 112 X 28, was bedeutet, dass ich für jede Spalte 4 Zeilen anzeigen möchte. Wie kann ich den oberen oder unteren dreieckigen Teil dieser Matrix loswerden? Da dies das Löschen von 4 Zeilen pro Spalte diagonal Tril oder Triu-Funktionen bedeutet, funktioniert nicht (sie sind für quadratische Matrizen). DankBeseitigung der oberen oder unteren dreieckigen Teil einer symmetrischen Matrix

Antwort

3

Wenn Sie das Image Processing Toolbox haben könnten Sie imresize verwenden, um eine obere Dreiecksmaske, um die Größe, die Sie dann

msk = imresize(triu(true(min(size(a)))), size(a), 'nearest'); 

% Just zero-out the lower diag 
zeroed = msk .* a; 

% Select the elements in the upper diagonal 
upperdiag = a(msk); 

die entsprechenden Daten verwenden, um auszuwählen Wenn Sie die Image Processing Toolbox nicht haben (und imresize) Sie können wie etwas tun

msk = reshape(repmat(permute(triu(true(min(size(a)))), [3 1 2]), size(a,1)/size(a,2), 1), size(a)); 
+0

Ja ich habe die Image Processing Toolbox und ich habe was ich will von imagesc (zeroed) Vielen Dank! –

4

Sie kron Funktion

können
kron(triu(ones(28)),[1 ;1 ;1 ;1]) 
2

kam ich mit einer Lösung oben mit meshgrid

Definieren Sie zunächst ein Raster, das alle Indizes Ihrer Matrix deckt

[X, Y] = meshgrid([1:28], [1:112]); 

Sie möchten alle Werte maskieren oben (oder unten) die Diagonale 4x = y. Definieren Sie einfach die Maske als Funktion Ihrer X- und Y-Werte.

mask = 4.*X >= Y; %>= Selects above the diagonal, <= selects below the diagonal 

Hier ist die Maske. Beachten Sie, dass die Achsen nicht symmetrisch sind.

Diagonal Mask

können Sie diese Methode verwenden, um alle Trennlinie oder eine Funktion auf dem Gitter zu definieren. Man könnte sogar eine Parabel

mask_parabola = (X-14).^2 >= Y; 

Parabola Mask

1

Es gibt nette Antworten tun, aber vielleicht kann man dieses eine Alternative mit triu Funktion sein:

% image 
img = rand(112, 28); 

% utilize a square matrix to use triu command 
temp = nan(112, 112); 
temp(:, 1:4:end) = img; 
temp = triu(temp, -3); 

% put the relevant elements back 
img = temp(:, 1:4:end); 
2

Sie die Maske mit bsxfun erstellen kann wie folgt :

M = 112; % number of rows 
N = 28; % number of columns 
mask = bsxfun(@le, (1:M).', (1:N)*round(M/N)); % create mask 
data = data.*mask; % multiply your data matrix by the mask 
Verwandte Themen