2016-10-12 12 views
3

Ich kenne den Code unten: mit 1. gefüllt werden Was soll ich tunWie erstelle ich einen Diamanten, der mit einem in der Mitte einer Matrix gefüllt ist?

A= 
    0 0 1 0 0 
    0 1 0 1 0 
    1 0 0 0 1 
    0 1 0 1 0 
    0 0 1 0 0 

Aber ich möchte, dass die Diamant:

N = 5; 
assert(N>1 && mod(N,2)==1); 
A = zeros(N); 

% diamond mask 
N2 = fix(N/2); 
[I,J] = meshgrid(-N2:N2); 
mask = (abs(I) + abs(J)) == N2; 

% fill with zeros 
A(mask) = 1; 

die Matrix A dazu verwandelt?

+1

scheint relevant: [ 'Erstellen Sie eine„Pyramide“matrix'] (http : //stackoverflow.com/questions/33756154/create-a-pyramid-matrix). – Divakar

Antwort

0

Fügen Sie einfach ein for loop und alle Diagonalen füllen:

N = 5; 
assert(N>1 && mod(N,2)==1); 
A = zeros(N); 

% diamond mask 
N2 = fix(N/2); 
[I,J] = meshgrid(-N2:N2); 
for id = 0:N2 
    A((abs(I) + abs(J)) == id) = 1; 
end 
1

Was Sie brauchen, ist eine 1 oder eine 0 auf dem Manhattan distance von jedem Array Lage zum Zentrum Ihres Diamanten

N = 5; 
assert(N>1 && mod(N,2)==1); 
A = false(N); 

[m, n] = size(A); %dimensions of A 
X = floor([m, n]/2); %floored division gives integer indices of center of array 
x = X(1); y = X(2); 
radius = m/2;  %half the height gives the radius 
for a = 1 : m 
    for b = 1 : n 
     A(a,b) = abs(a-x)+abs(b-y) <= radius; %test if manhatten distance <= radius 
    end 
end  
Basis zurückzukehren

Dies muss natürlich bearbeitet werden, um Ihrem speziellen Fall gerecht zu werden ... Insbesondere kann die Mitte Ihres Diamanten realistisch platziert werden, indem Sie x, y ändern, und der Radius kann entweder kleiner oder größer als die halbe Breite des Arrays sein also wähle.

+1

Ich habe mir die Freiheit genommen, Ihren Code zu ändern, so dass es die richtige MATLAB-Syntax ist. Irgendetwas an einer Kreuzung von C, MATLAB und Pseudocode ließ meine Augen zucken. – rayryeng

+0

@rayryeng haha, yah meine einzige Erfahrung mit Matlab war ein Semester Kurs vor fast 5 Jahren .... danke – Aaron

+0

Kein Problem :) Ich habe Ihnen meine Stimme gegeben. – rayryeng

4

Hier ist ein vektorisiert Ansatz bsxfun -

Nh = (N+1)/2; 
range_vec = [1:Nh Nh-1:-1:1]; 
out = bsxfun(@plus,range_vec(:),range_vec) > Nh 

Beispielläufe -

1) N = 5:

out = 
    0  0  1  0  0 
    0  1  1  1  0 
    1  1  1  1  1 
    0  1  1  1  0 
    0  0  1  0  0 

2) N = 9:

out = 
    0  0  0  0  1  0  0  0  0 
    0  0  0  1  1  1  0  0  0 
    0  0  1  1  1  1  1  0  0 
    0  1  1  1  1  1  1  1  0 
    1  1  1  1  1  1  1  1  1 
    0  1  1  1  1  1  1  1  0 
    0  0  1  1  1  1  1  0  0 
    0  0  0  1  1  1  0  0  0 
    0  0  0  0  1  0  0  0  0 
+1

Du machst mich echte Gefühle für 'bsxfun'! – erfan

+2

Es hat 'Spaß' drin! Was kann man mehr als * Gefühle * erwarten! ;) – Divakar

+3

@erfan Du wirst dich sehr bald darin verlieben. Divakar hat mir das vor langer Zeit klar gemacht. – rayryeng

2

Sie können 0 verwendenund flip Funktionen:

mat = tril(ones(N), round((N-1)/2)) - tril(ones(N), round((-N-1)/2)); 
out = mat & flip(mat) 

Odd Werte von N:

% N = 5; 

out = 

    0  0  1  0  0 
    0  1  1  1  0 
    1  1  1  1  1 
    0  1  1  1  0 
    0  0  1  0  0 

Auch Werte von N:

% N = 4; 

out = 

    0  1  1  0 
    1  1  1  1 
    1  1  1  1 
    0  1  1  0 
Verwandte Themen