public Matrix <TVal> SetDiagonal(TVal val) { Matrix <TVal> A = this; using (var inplace = new InPlaceGuard(A)) { Matrix <TVal> B = inplace.Matrix; for (int i = 0; i < Math.Min(A.Rows, A.Cols); i++) { B[i, i] = val; } return(B); } }
public Matrix <TVal> BinaryOp(TVal val, Func <TVal, TVal, TVal> op) { Matrix <TVal> A = this; using (var inplace = new InPlaceGuard(A)) { Matrix <TVal> B = inplace.Matrix; for (int i = 0; i < A.Rows; i++) { for (int j = 0; j < A.Cols; j++) { B[i, j] = op(A[i, j], val); } } return(B); } }
public Matrix <TVal> SetEach(Func <int, int, TVal> op) { Matrix <TVal> A = this; using (var inplace = new InPlaceGuard(A)) { Matrix <TVal> B = inplace.Matrix; for (int i = 0; i < A.Rows; i++) { for (int j = 0; j < A.Cols; j++) { B[i, j] = op(i, j); } } return(B); } }
public Matrix <TVal> BinaryOp(Matrix <TVal> B, Func <TVal, TVal, TVal> op) { Matrix <TVal> A = this; if (A.Cols != B.Cols || A.Rows != B.Rows) { throw new InvalidOperationException("dimensions does not agree"); } using (var inplace = new InPlaceGuard(A)) { Matrix <TVal> C = inplace.Matrix; for (int i = 0; i < A.Rows; i++) { for (int j = 0; j < A.Cols; j++) { C[i, j] = op(A[i, j], B[i, j]); } } return(C); } }