matvec.m

matvec.m — Objective-C source code, 1 kB (1.402 bytes)

Dateiinhalt

function b = matvec(row, col, val, x)
  %matvec berechnet b = A*x wenn A im Koordinaten-Format
  %gegeben ist.   
  
  %Wir ueberpruefen ob row ein Spaltenvektor (oder Nullvektor)
  %ist und ob die Dimensionen von row, col und val uebereinstimmen:
  if (size(row,2) ~= 1 && size(row,2) ~= 0) 
      error('row muss ein Spaltenvektor sein.');
  end
  if ( size(col) ~= size(row) )
      error('col hat nicht die gleiche Dimension wie row.');
  end
  if ( size(val) ~= size(row) )
      error('val hat nicht die gleiche Dimension wie row.');
  end

  %das Maximum von row entspricht der Anzahl der Zeilen von A
  n = max(row);
  if ( min(row) < 0 )
      error('row darf nur nichtnegative Eintraege haben!');
  end

  %das Maximum von col entspricht der Anzahl der Spalten von A
  m = max(col);
  if ( min(col) < 0 )
      error('col darf nur nichtnegative Eintraege haben!');
  end

  %ist x richtig dimensioniert?
  if (size(x,2) ~= 1)
      error('x muss ein Spaltenvektor sein.');
  end      
  
  %Anzahl der nicht-null Elemente
  nz = size(row,1);   
  
  %Initialisierung von b
  nb = size(x,1);
  b = zeros(nb,1); 
  
  %Berechnung von b = A x
  for i=1:nz
      b(row(i)) = b(row(i)) + val(i) .* x(col(i));
  end
  
  %Vorsicht: die Vektorschreibweise
  %      b(row) = val .* x(col) 
  % liefert ein falsches Ergebnis wenn ein Eintrag in row
  % doppelt vorkommt (wovon man ausgehen muss!).
end