2017-07-06 1 views
1

Ich habe eine Matrix der Dimension Am -by- n bestehend aus Nullen und Einsen, und eine Matrix der Dimension Jm -Durch-1 berichtet einige ganze Zahlen von [1,...,n] Ergänzung erfordert .Vektorisieren einen Code, der einige Elemente eines binären Arrays

Ich möchte, um eine Matrix der Dimension Bm -by- n derart auszubilden, daß für i = 1,...,m

  1. B(i,j) = A(i,j) für j=1,...,n-1
  2. B(i,n) = abs(A(i,n)-1)
  3. Wenn sum(B(i,:)) ist ungerade dann B(i,J(i)) = abs(B(i,J(i))-1)

Dieser Code tut, was ich will:

m = 4; 
n = 5; 
A = [1 1 1 1 1; ... 
    0 0 1 0 0; ... 
    1 0 1 0 1; ... 
    0 1 0 0 1]; 
J = [1;2;1;4]; 
B = zeros(m,n); 
for i = 1:m 
    B(i,n) = abs(A(i,n)-1); 
    for j = 1:n-1 
     B(i,j) = A(i,j); 
    end 
    if mod(sum(B(i,:)),2)~=0 
     B(i,J(i)) = abs(B(i,J(i))-1); 
    end 
end 

Können Sie effizientere Algorithmen vorschlagen, dass die Verwendung nicht die verschachtelte Schleife?

Antwort

5

Für Ihre Frage sind keine For-Schleifen erforderlich. Es muss nur eine effektive Nutzung des colon Operator und logisch-Indizierung wie folgt:

% First initialize B to all zeros 
B = zeros(size(A)); 
% Assign all but last columns of A to B 
B(:, 1:end-1) = A(:, 1:end-1); 
% Assign the last column of B based on the last column of A 
B(:, end) = abs(A(:, end) - 1); 
% Set all cells to required value 
% Original code which does not work: B(oddRow, J(oddRow)) = abs(B(oddRow, J(oddRow)) - 1); 
% Correct code: 
% Find all rows in B with an odd sum 
oddRow = find(mod(sum(B, 2), 2) ~= 0); 
for ii = 1:numel(oddRow) 
    B(oddRow(ii), J(oddRow(ii))) = abs(B(oddRow(ii), J(oddRow(ii))) - 1); 
end 

ich für den letzten Teil denke, es am besten ist es, eine for Schleife zu verwenden.

Edit: den netten Trick von EBH Sehen Sie tun können, den letzten Teil ohne for Schleife

+0

war nur die gleiche Antwort gehen zu posten ... – EBH

+0

sah ich Ihren Beitrag und dann sah es gelöscht wurde. Du warst nur ein kleines bisschen spät – anyanwu

+0

Nun, ich habe von meinem Handy aus geantwortet, also hat es etwas mehr Zeit zum Tippen gebraucht;) – EBH

2

Gerade in den @ammportal good answer, auch der letzte Teil ohne eine Schleife mit dem Einsatz von linear indices erfolgen. Dafür ist sub2ind nützlich. Also den letzten Teil der vorherigen Antwort Annahme, kann dies geschehen:

% Find all rows in B with an odd sum 
oddRow = find(mod(sum(B, 2), 2) ~= 0); 
% convert the locations to linear indices 
ind = sub2ind(size(B),oddRow,J(oddRow)); 
B(ind) = abs(B(ind)- 1); 
+1

netter Trick. Ich habe nicht daran gedacht :). Upvoted – anyanwu

+1

Anscheinend hatte ich hier etwas zu beantworten .... – EBH

+0

enthalten einen Link zu Ihrer Antwort in meinem – anyanwu

Verwandte Themen